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