使用新运算符后如何正确删除指针?代码不断抛出错误

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,然后立即分配给指针,失去对新指针的跟踪。然后你双删

但如前所述,您的代码中不应使用指针。