Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;析构函数解分配问题_C++_Destructor_Memory Management - Fatal编程技术网

C++ c++;析构函数解分配问题

C++ c++;析构函数解分配问题,c++,destructor,memory-management,C++,Destructor,Memory Management,我试图编写一个包含双*数组的类,该数组可以通过各种方式填充,在程序结束时,内存应该被释放-唉,这不起作用 我收到“programname.exe已触发断点”的通知,这会将我带到main.cpp的最后一行-当我删除析构函数时,它工作正常,因此我假设它一定与此有关 以下是相关代码: h 主要 非常感谢 你遇到了三条规则 如果您这样做,它将起作用: polynom p1(2, arr1); polynom p2(2, arr2); 问题是赋值运算符没有复制数组,因此当您分配本地临时变量时,它会立即被

我试图编写一个包含双*数组的类,该数组可以通过各种方式填充,在程序结束时,内存应该被释放-唉,这不起作用

我收到“programname.exe已触发断点”的通知,这会将我带到main.cpp的最后一行-当我删除析构函数时,它工作正常,因此我假设它一定与此有关

以下是相关代码:

h

主要


非常感谢

你遇到了三条规则

如果您这样做,它将起作用:

polynom p1(2, arr1);
polynom p2(2, arr2);
问题是赋值运算符没有复制数组,因此当您分配本地临时变量时,它会立即被销毁(与数组一起)。然后,当局部变量超出范围时,它们会尝试删除已删除的指针

您不应该重写
运算符=
,而应该创建一个复制构造函数
多项式(const polynom&)
。您很少需要重写
运算符=
。复制构造函数也更通用-它允许您按值传递对象,而
operator=
仅特定于赋值


在任何情况下,都必须分配一个新数组并复制内容,而不是复制指针。您应该真正使用
std::vector
,这样您就不会有这些问题。

在下文中,您将为多项式中的arr数组分配堆栈定义的变量

double arr1[] = {5,0,1};
double arr2[] = {3,2,1};
polynom p1 = polynom(2, arr1);
polynom p2 = polynom(2, arr2);
一旦多项式被破坏,它会删除那些指针。。。你可能不会这样写:

double arr1[] = {1,2,3};
delete arr1;
同样的问题

---更新

解决这个问题有两种可能的方法:

  • 接受用户数据的构造函数分配缓冲区并创建副本
  • 这是最安全的,因为这样可以认为对象内的缓冲区是安全的。在非常大的项目中,从长远来看,这将为您节省大量时间,假设您不分配数百万个多项式对象。。。在这种情况下,速度缓慢可能成为一个问题

  • 构造函数将输入标记为用户输入,这意味着它无权删除它,调用方对此负责
  • 这是通过添加布尔标志来实现的,如果设置为true(例如),析构函数不会删除缓冲区

    然而,这种方法存在一个巨大的问题:如果使用基于堆栈的缓冲区,并且返回多项式,那么该缓冲区将被return语句删除,并且您有一个bug

    因此,我不建议您使用此方法

    ---附加说明

    您编写了
    polynom(2,arr1)。。。请注意,数组中有三个元素。我建议您改用sizeof():
    polynom(sizeof(arr1)/sizeof(arr1[0]),arr1)


    另外,正如另一个答案所提到的,您希望重载polynom copy构造函数和copy赋值,因为这两种方法都会破坏代码。不过,只要不复制多项式,就可以了。但是,目前的情况是,您最终将使用默认设置,它们根本无法正常工作。

    如果您试图删除堆栈分配的阵列,这将使应用程序正常崩溃。您可能希望避免使用原始指针,而是查看
    td::shared_ptr
    std::unique_ptr
    您不能
    删除
    未从
    new
    分配的内存,这显然不是主要问题,但别忘了定义一个副本。很抱歉,可能是,我不太明白-我把代码改成了
    polynomp1(2,arr1)等等,但它仍然不起作用。覆盖=运算符是我的教授给出的限制。对不起,另一个答案解决了这个问题。我没有检查你所有的构造器。Mine指出了一个不同的问题。有没有办法分配堆栈定义的变量,并且仍然能够设置一个“正确的”析构函数这种输入数组的方法是我的教授建议的。你必须分配一个新数组并复制你所传递的数组的内容。或者使用
    std::vector
    。啊,谢谢,我相应地更改了2参数构造函数,现在它可以工作了
    polynom p1(2, arr1);
    polynom p2(2, arr2);
    
    double arr1[] = {5,0,1};
    double arr2[] = {3,2,1};
    polynom p1 = polynom(2, arr1);
    polynom p2 = polynom(2, arr2);
    
    double arr1[] = {1,2,3};
    delete arr1;