Memory leaks 列表包含数百万从未添加过的空对象

Memory leaks 列表包含数百万从未添加过的空对象,memory-leaks,c++-cli,stdlist,Memory Leaks,C++ Cli,Stdlist,出于某种原因,我的std::list在程序执行的中途包含了1000000多个空对象(根据调试器) 我已经在push_front()和push_back()上设置了断点,但它们都没有被调用1000000次,我的实际代码只使用过这两个函数 恐怕我不知道在这里复制什么代码-这里是生成的系统的实际位置。AccessViolationException,但是。。。好吧,我会把任何人要的东西都抄进来 //Model.h struct Update { public: double pEgivenH,

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

我已经在
push_front()
push_back()
上设置了断点,但它们都没有被调用1000000次,我的实际代码只使用过这两个函数

恐怕我不知道在这里复制什么代码-这里是生成的
系统的实际位置。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;
}
编辑:我将调试代码添加到<代码>假设::更新假设(更新)。新函数如下所示:

//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()

上崩溃。您确定可以信任调试器吗?您正在使用启用混合调试的调试生成吗

假设一切正常,列表很可能已经被破坏了。也许你有一个缓冲区溢出的地方,过度编写。也许
h
是一个悬空的指针。这是这里最可能出现的错误,但这意味着您将不得不查看更多的代码,而不仅仅是崩溃的代码行


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

因此,事实证明这确实是内存问题-UpdateButton是使用指向列表元素的指针构造的,我通过获取在for-each循环中创建的对象的地址得到。显然,这会创建列表元素的副本;当我用for迭代器替换for each并定义

Hypothesis h = *it;
程序继续失败,但当我使用

Hypothesis &h = *it;

取而代之的是我的持久指针。

您还可以粘贴调试器信息吗。这可能有助于我们了解您正在查看的内容。这就是您想要的吗?调试器正在使用
列表中的内置计数器。尝试使用
std::distance(l.begin(),l.end())
验证是否确实存在项目。如果没有,或者该操作崩溃,则可能会从列表对象下面分配的任何对象中产生缓冲区溢出。。。。那很有趣。WriteLine甚至可以使用迭代器吗?我觉得这有点奇怪。老实说,我不知道。我是C++的新手,使用MixFFT Visual Studio 2012,所以我想假设……也,<代码>更新(,)>代码>编译失败,而<代码> Update::更新(,)成功。不确定那是关于什么的。哦,我很确定它是,在UpdateButton的某个基类中。所以正确的形式应该是
AutoBayes::Update(,)
;UpdateButton继承自按钮。Update是一个完全不同的类。而
AutoBayes::Update(,)
只返回
名称空间“AutoBayes”没有成员“Update”
。它正在查找这个更新方法:它处于控制中,是Button的基类,因此是UpdateButton的基类。如果您的更新类不在名称空间AutoBayes中,则使用任何合适的限定名:更新,也许吧。我不知道,因为您的代码片段中没有包含名称空间;对于引用,它也应该和for-each循环一起工作。
Hypothesis &h = *it;