微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用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,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 举报,一经查实,本站将立刻删除。