如何解决使用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,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,l;
return 0; //Return nothing
}
解决方法
简短的回答是,从代码中删除所有指针、new 和 delete。
任何地方都不需要它。
从字面上删除对两者的每次调用,并删除每个 *
(除非用于乘法),您的代码就会变得正确。
不是针对这个问题,但在其他情况下,您需要阅读五的规则,默认使用unique_ptr
,并直接调用make_unique
而不是new
。
导致崩溃的具体问题包括调用 new
,然后立即分配指针,失去对新指针的跟踪。然后你双重删除。
但如前所述,显示的代码中不应使用指针。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。