gpt4 book ai didi

C++ 析构函数在删除调用时崩溃

转载 作者:太空宇宙 更新时间:2023-11-04 13:39:06 26 4
gpt4 key购买 nike

我有一个非常奇怪且可能很明显的问题,但我似乎找不到错误。我有一个类对象,它包含指向另一个类对象的指针,当调用第一个类对象的解构器时,它会尝试删除它的指针,但会导致段错误,而不会进入第二个类对象的解构器。

具体来说,我有一个 Optimizer 类的实例:

class Optimizer {
public:
Optimizer();
~Optimizer();

//Lot's of public methods and such

private:
PredictionRenderer *_predictionRenderer;

//Lot's of member variables

};

Optimizer::~Optimizer() {
std::cout<<"optimizer destructor:"<<_predictionRenderer->getWidth()<<std::endl;
delete _predictionRenderer; //THIS LINE CRASHES AND NEVER MAKES IT INTO THE PREDICTION RENDERER DECONSTRUCTOR
//other calls
}

(这是一个大项目,为了简洁起见,我删除了所有额外的方法/变量)。

Optimizer 有一个指向 PredictionRenderer 对象的指针,_predictionRenderer。该指针在调用构造函数期间初始化。该指针是私有(private)的,我检查并确保它无法“退出”(也就是说,此优化器对象之外的任何人都无法获得该指针。它永远不会被任何优化器的方法返回,也永远不会通过优化器方法传递给任何方法)。

尝试删除 Optimizer 对象时,我的程序在 delete _predictionRenderer 行出现段错误。执行永远不会进入 PredictionRenderer 解构器。我在delete调用之前的print语句中添加了验证指针不为NULL或者已经被删除,调用PredictionRenderer的getWidth方法成功返回,说明它一定是一个有效的指针(是否可以调用一个方法删除的对象?)。此外,print 语句只打印一次,所以我很确定 Optimizer 对象没有被复制和删除两次。最后,永远不会调用 PredictionRenderer 的解构函数,不会通过 delete 或其他任何方式调用。

我不知道是什么原因造成的。有没有人知道发生了什么事?

编辑:正如我在评论中提到的,这个代码库很大。我为没有展示太多而道歉,但我不能真正展示所有内容,因为没有足够的空间。这是我正在使用的其他人的代码,据我所知,他从未真正破坏这个对象,他只是让它在程序退出时被释放。我也可以这样做,但这似乎是一种黑客行为,而不是开展业务的好方法。

最佳答案

您确定要删除 _predictionRenderer 吗?你应该先检查一下。

if (_predictionRenderer)
delete _predictionRenderer;

如果你试图删除一个从未分配内存的指针,你的程序将会崩溃。

关于C++ 析构函数在删除调用时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28443670/

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