-1

你能帮我解决这个问题吗?我想将向量从 Typ 类中的函数返回到主函数:

在类类型:

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]);
}

到字符串:

 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++ 异常:内存位置 0x002fec9c 处的 std::__non_rtti_object..

谢谢你的回复。

4

2 回答 2

0

这与向量无关,也与函数的返回值无关。异常消息清楚地说明了问题所在:您假定的对象实际上不是对象-因为您将具有自动存储持续时间(“局部变量”)的块范围对象的地址放入向量中,这是无效的,因此您的程序调用未定义的行为。

(这仅在您的意思是

te0.push_back(&tesV1);

代替

te0.push_back(&hpv1);

否则您的代码甚至无法编译。)

于 2013-05-30T21:35:12.647 回答
0

(您的代码中有几个拼写错误,我假设您的意思是“tesV1”而不是“hpv1”,并且始终是“Test”或“test”等等。)

您正在将指针推送到在 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() 中分配的内存永远不会被释放。

于 2013-05-30T21:35:18.743 回答