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

时间:2015-02-10 23:10:44

标签: c++ pointers segmentation-fault delete-operator

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

具体来说,我有一个类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的指针。在调用构造函数期间初始化此指针。指针是私有的,我检查并确保它无法退出&#34; (也就是说,此Optimizer对象之外的任何人都无法获得此指针。它永远不会被任何优化器方法返回,并且它永远不会通过优化器方法传递给任何方法)。

尝试删除Optimizer对象时,我的程序会在delete _predictionRenderer行上发生段错误。执行永远不会进入PredictionRenderer解构器。我在删除调用之前添加了print语句以验证指针是否为NULL或已被删除,并且对PredictionRenderer的getWidth方法的调用成功返回,这表明它必须是有效指针(是否可以调用已删除对象的方法?)。此外,print语句只打印一次,因此我非常确定Optimizer对象不会被复制和删除两次。最后,不会通过删除或其他任何地方调用PredictionRenderer的解构函数。

我不知道造成这种情况的原因。有没有人对正在发生的事情有任何了解?

编辑:正如我在评论中提到的,这个代码库很大。我为没有多少表现而道歉,但我无法真实地展示一切因为没有足够的空间。这是我正在使用的其他人的代码,而且据我所知,他实际上并没有破坏这个对象,只是让它在程序退出时被解除分配。我也可以做到这一点,但这似乎是一种黑客行为,而不是一种开展业务的好方法。

2 个答案:

答案 0 :(得分:0)

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

if (_predictionRenderer)
    delete _predictionRenderer;

如果您尝试删除从未分配内存的指针,程序将崩溃。

答案 1 :(得分:0)

您发布的代码行没有错。 我建议在初始化后立即交叉检查_predictionRenderer ptr的值,并将其与您在Optimizer::~Optimizer()中看到的值进行比较。他们应该是一样的,如果不是你在外面有问题。可能是你的容器对象已损坏。