std :: list包含数百万个从未添加的空对象

时间:2013-08-20 08:24:26

标签: memory-leaks c++-cli stdlist

由于某种原因,我的std :: list包含超过1000000个空对象(根据调试器)在程序执行的中途。

我在push_front()push_back()上放置了断点,但它们都没有被称为1000000次,而我的实际代码只使用这两个函数。

我担心我不知道要在这里复制什么代码 - 这里是结果System.AccessViolationException的实际位置,但是......好吧,我会复制任何人要求的内容。

//Model.h
struct Update {
public:
    double pEgivenH, pE;
    int E;

    Update(double, double, int);
    Update &operator=(const Update &rhs);
    int operator==(const Update &rhs) const;
    int operator<(const Update &rhs) const;
};

//UpdateButton.h
System::Void UpdateButton::UpdateButton_Click(System::Object^ sender, System::EventArgs^ e) {
    double pEgivenH, pE;
    int EID;

    System::String^ pEHStr = pEHholder->Text;
    System::String^ pEStr = pEholder->Text;
    System::String^ eviStr = eviholder->Text;

    pEgivenH = double::Parse(pEHStr);
    pE = double::Parse(pEStr);

    std::string evistr = msclr::interop::marshal_as<std::string>(eviStr);
    EID = m->registerEvidence(evistr);

    h->updateHypothesis(Update::Update(pEgivenH, pE, EID));//This line
}

//Model.cpp
double Hypothesis::updateHypothesis(Update u) {
    history.push_back(u); //This line.
    currentP *= u.pEgivenH / u.pE;
    return currentP;
}

调试器数据:

A first chance exception of type 'System.AccessViolationException' occurred in System.Windows.Forms.dll
An unhandled exception of type 'System.AccessViolationException' occurred in System.Windows.Forms.dll
Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
The program '[4500] AutoBayes.exe: Managed (v4.0.30319)' has exited with code 0 (0x0).

编辑:我在Hypothesis::updateHypothesis(Update)添加了调试代码。新函数读取

//Model.cpp
double Hypothesis::updateHypothesis(Update u) {
    System::Diagnostics::Debug::WriteLine(history.begin(), history.end());
    history.push_back(u); //This line.
    currentP *= u.pEgivenH / u.pE;
    return currentP;
}

程序现在在调试行崩溃了,我得到了

A first chance exception of type 'System.NullReferenceException' occurred in AutoBayes.exe
An unhandled exception of type 'System.NullReferenceException' occurred in AutoBayes.exe
Additional information: Object reference not set to an instance of an object.

堆栈跟踪表明它在::end()上崩溃。

2 个答案:

答案 0 :(得分:0)

您确定可以信任调试器吗?您是否正在使用启用混合调试的调试版本?

假设一切都很好,很可能列表已经被破坏了。也许你有一个覆盖它的缓冲区溢出。也许h是一个悬垂的指针。像这样的东西在这里是最可能的错误,但这意味着你将不得不查看更多的代码而不仅仅是崩溃的行。

对于记录,Update::Update(pEgivenH, pE, EID)应该只是Update(pEgivenH, pE, EID),但这不太可能是错误的来源:它应该无法编译。

答案 1 :(得分:0)

事实证明它确实是一个内存问题 - UpdateButton是使用指向列表元素的指针构造的,我通过获取在for-each循环中创建的对象的地址获得了该列表元素。显然,它创建了列表元素的副本;当我用for-iterator替换for-each并定义

Hypothesis h = *it;

程序继续失败,但是当我使用

Hypothesis &h = *it;

相反,我得到了持久的指针。