1

我正在尝试使用 ptr_vector 来存储一些指针,但是一旦我的 main 方法出现错误。这是我的代码:

int main(void)
{
    boost::ptr_vector<string> temp;
    string s1 = "hi";
    string s2 = "hello";
    temp.push_back(&s1);
    temp.push_back(&s2);
    return 0;
}

这是我收到的错误消息:

Critical error detected c0000374
Windows has triggered a breakpoint in Path_Tree.exe.

This may be due to a corruption of the heap, which indicates a bug in Path_Tree.exe or     any of the DLLs it has loaded.

This may also be due to the user pressing F12 while Path_Tree.exe has focus.

The output window may have more diagnostic information.
The program '[7344] Path_Tree.exe: Native' has exited with code 0 (0x0).

我究竟做错了什么?谢谢!

4

3 回答 3

10

ptr_vector获取您给它的指针所指向的对象的所有权(这意味着它delete在完成这些指针时会调用它们)。如果您只想要一个指针向量,请使用:

int main()
{
    std::vector<string*> temp;
    //s1 and s2 manage their own lifetimes
    //(and will be destructed at the end of the scope)
    string s1 = "hi";
    string s2 = "hello";
    //temp[0] and temp[1] point to s1 and s2 respectively
    temp.push_back(&s1);
    temp.push_back(&s2);
    return 0;
}

否则,您应该使用 new 分配字符串,然后 push_back 结果指针:

int main()
{
    boost::ptr_vector<string> temp;
    temp.push_back(new string("hi"));
    temp.push_back(new string("hello"));
    return 0;
}

如果您只想要一个字符串容器,通常的做法是字符串向量:

int main()
{
    std::vector<string> temp;
    //s1 and s2 manage their own lifetimes
    //(and will be destructed at the end of the scope)
    string s1 = "hi";
    string s2 = "hello";
    //temp[0] and temp[1] refer to copies of s1 and s2.
    //The vector manages the lifetimes of these copies,
    //and will destroy them when it goes out of scope.
    temp.push_back(s1);
    temp.push_back(s2);
    return 0;
}

ptr_vector旨在使具有值语义的多态对象更容易。如果您的字符串首先不是多态的,那么ptr_vector完全没有必要。

于 2012-08-15T15:20:46.080 回答
1

ptr_vector旨在存储指向动态分配对象的指针。然后它取得它们的所有权并在其生命周期结束时删除它们。如果将指针传递给无法删除的对象,则会得到未定义的行为。

int main(void)
{
    boost::ptr_vector<std::string> temp;
    temp.push_back(new std::string("hi"));
    temp.push_back(new std::string("hello"));
    return 0;
}
于 2012-08-15T15:20:02.960 回答
0

如果您不打算将指针推回它,那么使用 ptr_vector 是没有意义的。

使用 std::vector 或推回使用 new 关键字分配的字符串。

于 2012-08-15T15:21:34.533 回答