在课堂上:
vector<Test*> NetworkType::createObject(int r1, int r2, r3) {
vector<test*> te0;
if (res1 == 1 && res2 == 1 && res3 == 1) {
TestV *p1 = new TestV("aaa","bbb",3,"ooo","ccc", "ttt", "testX", "sk2");
TestV *p3 = new TestV("rrr","ddd",3,"ooo","ccc", "ttt", "testY", "sk2");
//return p1;
TestV tesV1(*p1);
te0.push_back(&tesV1);
TestV tesV2(*p3);
te0.push_back(&tesV2);
return te0;
} else {
...
}
}
主:
Typ nk;
vector<Test*> p;
p = nk.createObject(p0,p1,p2);
输出:
for(int i = 0; i < p.size(); i++){
cout << "\n" + toString(p[i]);
}
的toString:
std::string toString(Test* arg) {
TestV* teV = dynamic_cast<TestV*>(arg);
TestN* teN = dynamic_cast<TestN*>(arg);
if (teV)
{
return teV->toString();
}
else
{
return teN->toString();
}
return "";
};
编译是正确的,但在运行程序后我得到了这个错误:
VolbaHoneypotu.exe中0x76dac41f的未处理异常:Microsoft C ++ 异常:std :: __ non_rtti_object在内存位置0x002fec9c ..
感谢您的回复。
答案 0 :(得分:0)
这与向量无关,也与函数的返回值无关。异常消息清楚地说明了什么是错误的:你假设的对象实际上不是对象 - 因为你将带有自动存储持续时间(“局部变量”)的块作用域对象的地址放到向量中,这是无效的,所以你的程序调用未定义的行为。
(仅当你的意思是
时才有效te0.push_back(&tesV1);
而不是
te0.push_back(&hpv1);
否则您的代码甚至无法编译。)
答案 1 :(得分:0)
(你的代码中有几个拼写错误,我假设你的意思是“tesV1”而不是“hpv1”,并且一直是“测试”或“测试”等等。)
您正在推送指向createObject()函数中堆栈上分配的变量的指针:
TestV tesV1(*p1);
te0.push_back(&hpV1);
HoneypotV tesV2(*p3);
te0.push_back(&hpV2);
这些对象是在堆上分配的对象的副本(带有“new”),但这并不重要。一旦范围结束(当您从函数返回时),堆栈上的对象就会消失。当你在那之后取消引用指针时,你会遇到麻烦。
目前还不完全清楚你要做的是什么,但如果直接将指针推送到堆分配的对象,你将不会遇到这种麻烦:
te0.push_back( p1 );
te0.push_back( p2 );
另请注意,当您使用“new”分配对象时,通常希望您还应使用“delete”取消分配它。
表示你编写的代码会泄漏内存 - 在createObject()中分配的内存永远不会被释放。