使用新运算符后如何正确删除指针?代码不断抛出错误
How to correctly delete a pointer after using new operator? Code Keeps Throwing Error
因此,在我使用 new 运算符后尝试删除指针时,我总是遇到同样的错误。
我已经在网上查了很久,但我对发生的事情一头雾水,我是 C++ 的新手,正在做一项大学作业。
此外,我已经成功地对整数数组使用了 new 和 delete 运算符,并且没有 运行 出现问题。所以我很困惑,希望我只是做了一些愚蠢的事情。
任何帮助或指导都会很棒。对于上下文,该程序正在尝试求解一些二次方程。
你可以在下面看到我的代码和错误。整个程序 运行 正确直到它到达析构函数,然后我弹出一个窗口说“抛出异常:Task2。2.exe 已触发断点。”
然后屏幕跳转到 delete_scalar.cpp 中的断点并显示以下内容:
_CRT_SECURITYCRITICAL_ATTRIBUTE
void __CRTDECL operator delete(void* const block) noexcept
{
#ifdef _DEBUG
_free_dbg(block, _UNKNOWN_BLOCK);
#else
free(block);
#endif
}
下面的代码:
#include <iostream>
#include <cmath>
using namespace std;
class userValue
{
private:
double* a;
double* b;
double* c;
double discrim;
public:
userValue(double*, double*, double*);
~userValue();
void calcDiscrim();
void displayAns();
};
userValue::userValue(double *x, double *y, double *z)
{
discrim = 0;
a = new double;
a = x;
cout << "a: " << *a;
b = new double;
b = y;
cout << "b: " << *b;
c = new double;
c = z;
cout << "c: " << *c;
}
userValue::~userValue()
{
delete a, b, c;
}
void userValue::calcDiscrim()
{
discrim = *b * *b - (4 * *a * *c);
}
void userValue::displayAns()
{
double numerator, denominator, root1, root2;
if (discrim > 0)
{
cout << "The discriminant: " << discrim << " is nonnegative, now we'll solve the rest of the formula" << endl;
numerator = (-*b + sqrt(discrim));
denominator = 2 * *a;
root1 = numerator / denominator;
cout << "The first root is: " << root1 << endl;
numerator = (-*b - sqrt(discrim));
denominator = 2 * *a;
root2 = numerator / denominator;
cout << "The second root is: " << root2 << endl;
}
else {
cout << "The discriminant: " << discrim << " is negative and there are no real roots" << endl;
}
}
int main()
{
double a, b, c;
cout << "Enter the variables to be used in the quadratic equation: " << endl;
cout << "Enter a value for the variable 'a': ";
cin >> a;
cout << "Enter a value for the variable 'b': ";
cin >> b;
cout << "Enter a value for the variable 'c': ";
cin >> c;
double* j = new double(a);
double* k = new double(b);
double* l = new double(c);
userValue defineInputs(j, k, l);
defineInputs.calcDiscrim();
defineInputs.displayAns();
delete j, k, l;
return 0; //Return nothing
}
简短的回答是,从您的代码中删除所有指针、新建和删除。
哪里都不需要。
从字面上删除对两者的所有调用,并删除每个 *
(除了用于乘法),您的代码将变得正确。
不是这个问题,但在其他情况下,你需要阅读五的规则,默认使用unique_ptr
,并调用make_unique
而不是new
直接。
导致崩溃的具体问题包括调用 new
,然后立即分配给指针,失去对新指针的跟踪。然后你双删
但如前所述,您的代码中不应使用指针。
因此,在我使用 new 运算符后尝试删除指针时,我总是遇到同样的错误。 我已经在网上查了很久,但我对发生的事情一头雾水,我是 C++ 的新手,正在做一项大学作业。
此外,我已经成功地对整数数组使用了 new 和 delete 运算符,并且没有 运行 出现问题。所以我很困惑,希望我只是做了一些愚蠢的事情。
任何帮助或指导都会很棒。对于上下文,该程序正在尝试求解一些二次方程。
你可以在下面看到我的代码和错误。整个程序 运行 正确直到它到达析构函数,然后我弹出一个窗口说“抛出异常:Task2。2.exe 已触发断点。”
然后屏幕跳转到 delete_scalar.cpp 中的断点并显示以下内容:
_CRT_SECURITYCRITICAL_ATTRIBUTE
void __CRTDECL operator delete(void* const block) noexcept
{
#ifdef _DEBUG
_free_dbg(block, _UNKNOWN_BLOCK);
#else
free(block);
#endif
}
下面的代码:
#include <iostream>
#include <cmath>
using namespace std;
class userValue
{
private:
double* a;
double* b;
double* c;
double discrim;
public:
userValue(double*, double*, double*);
~userValue();
void calcDiscrim();
void displayAns();
};
userValue::userValue(double *x, double *y, double *z)
{
discrim = 0;
a = new double;
a = x;
cout << "a: " << *a;
b = new double;
b = y;
cout << "b: " << *b;
c = new double;
c = z;
cout << "c: " << *c;
}
userValue::~userValue()
{
delete a, b, c;
}
void userValue::calcDiscrim()
{
discrim = *b * *b - (4 * *a * *c);
}
void userValue::displayAns()
{
double numerator, denominator, root1, root2;
if (discrim > 0)
{
cout << "The discriminant: " << discrim << " is nonnegative, now we'll solve the rest of the formula" << endl;
numerator = (-*b + sqrt(discrim));
denominator = 2 * *a;
root1 = numerator / denominator;
cout << "The first root is: " << root1 << endl;
numerator = (-*b - sqrt(discrim));
denominator = 2 * *a;
root2 = numerator / denominator;
cout << "The second root is: " << root2 << endl;
}
else {
cout << "The discriminant: " << discrim << " is negative and there are no real roots" << endl;
}
}
int main()
{
double a, b, c;
cout << "Enter the variables to be used in the quadratic equation: " << endl;
cout << "Enter a value for the variable 'a': ";
cin >> a;
cout << "Enter a value for the variable 'b': ";
cin >> b;
cout << "Enter a value for the variable 'c': ";
cin >> c;
double* j = new double(a);
double* k = new double(b);
double* l = new double(c);
userValue defineInputs(j, k, l);
defineInputs.calcDiscrim();
defineInputs.displayAns();
delete j, k, l;
return 0; //Return nothing
}
简短的回答是,从您的代码中删除所有指针、新建和删除。
哪里都不需要。
从字面上删除对两者的所有调用,并删除每个 *
(除了用于乘法),您的代码将变得正确。
不是这个问题,但在其他情况下,你需要阅读五的规则,默认使用unique_ptr
,并调用make_unique
而不是new
直接。
导致崩溃的具体问题包括调用 new
,然后立即分配给指针,失去对新指针的跟踪。然后你双删
但如前所述,您的代码中不应使用指针。