gpt4 book ai didi

c++ - 使用此指针时 C++ 析构函数错误的原因?

转载 作者:行者123 更新时间:2023-11-28 03:33:33 25 4
gpt4 key购买 nike

我一直在编写代码,其中有很多类。我正在为构造函数中的不同对象数组分配内存。但是,当我认为一切正常时,我遇到了一个奇怪的错误。举个例子,假设我有一个名为 Points 的类,它有一个名为数据的双点数组。

好的,我现在发布所有代码:

class Points
{
double *data;

Points::Points()
{
data = new double [C_NUMBER_OF_POINTS];
}

Points::~Points()
{
delete [] this->data;
}
};

调试后发现是this指针的错误,不知为何?调用析构函数删除数据,虽然对象正在被销毁,但它仍然在内存中。我的问题是为什么会这样?

我得到的错误基本上是由于内存处理不当

Unhandled exception at 0x778f15de in HandTracker.exe: 0x00000000: The operation completed successfully. Blockquote

如果我删除这个指针意味着如果我使用下面的析构函数则错误是固定的

      Points::~Points()
{
delete []data;
}

我的问题不完全是关于如何处理内存泄漏,而是关于与此指针相关的这个特定问题。这个指针背后的机制是什么导致了这个错误?

最佳答案

最有可能的是,您在代码中的某处复制了 Points 的实例,或者根据对另一个的引用构造了一个实例。这使用相同的 data 指针创建了您的类的两个实例。当第一个被销毁时,它销毁了两个实例都有指针的对象。当第二个被访问或销毁时,它导致了问题,因为该对象已经不存在了。

最好的解决方法是通过使用具有自己的析构函数的经过良好测试的类来避免使用析构函数。例如,std::array (或 std::vector )在这种情况下。这将使一切都“神奇地工作”,因为这些类已经具有适当的析构函数、复制构造函数和复制赋值运算符。

否则,请确保您具有正确的复制构造函数和复制赋值运算符,因为默认值(成员复制/复制)在您的情况下不起作用。请参阅 James McNellis 关于三规则的评论。

试试这个:

Points::Points(const Points &a)
{
data = new double[C_NUMBER_OF_POINTS];
for (int i = 0; i < C_NUMBER_OF_POINTS; ++i)
data[i] = a.data[i];
}

Points& operator=(const Points& a)
{ // The key is that this overrides the catastrophic default -- data=a.data;
for (int i = 0; i < C_NUMBER_OF_POINTS; ++i)
data[i] = a.data[i];
return *this;
}

关于c++ - 使用此指针时 C++ 析构函数错误的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11856532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com