由于某种原因,我的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()
上崩溃。
答案 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;
相反,我得到了持久的指针。