C ++:vector <string> * args = new vector <string>();导致SIGABRT </string> </string>

时间:2011-02-16 17:22:05

标签: c++ new-operator stdvector sigabrt

非常自我解释。这是在“新向量”行上引起SIGABRT的方法:

vector<string> * Task::arguments() {
    vector<string> *args = new vector<string>(); // CAUSES SIGABRT
    int count = sizeof(_arguments);
    for (int x = 0; x < count; x++) {
        string argument(_arguments[x]);
        args->push_back(argument);
    }
    return args;
}

请注意,在其他地方,我称这条确切的行没有任何问题。以下是Task类中包含的列表:

#include <vector>
#include <unistd.h>
#include <string>
using namespace std;
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>

有什么想法吗?

4 个答案:

答案 0 :(得分:6)

此代码中没有真正的错误,但样式表明 您迫切需要good C++ book

正如@James在对该问题的评论中所说,使用 动态分配的 向量对象几乎肯定是错误的,不保留它当然是错误的在 智能指针 中 如果您在代码中的其他地方也这样做了,那么 可能会搞乱堆 ,这是我在new时可以想到的唯一情况会崩溃。

答案 1 :(得分:3)

好的,事实证明问题不在于矢量分配,而是在for()循环中。用适当的do / while循环替换它固定它。 GDB只是对错误的位置感到困惑,并将其粘贴在矢量线上......呃。考虑到使用STL,这并不奇怪。

另外,对那些说动态分配矢量的人来说可能搞乱堆 - 为什么?这毫无意义;我不在乎我是否动态分配每个对象;这样做不应该导致问题。混合堆栈和堆栈对象过去给我带来了很多问题;我可以始终如一地使用所有堆对象的唯一方法。

如果有人可以解释堆栈和堆对象如何共存,我会很高兴听到它,因为他们从来没有为我合作过。 Objective-C非常有意义,而C ++对对象的无意义处理几乎总是会导致问题。不幸的是我们需要使用C ++,因此我没有多少选择......

答案 2 :(得分:3)

int count = sizeof(_arguments);似乎非常可疑。

sizeof给出大小的字节数,而不是数组的元素数(除非每个元素只有一个字节,即char)。

干杯&amp;第h。,

答案 3 :(得分:2)

在您执行此调用之前,可能还有其他内容已损坏堆。你试过在valgrind或同等版本下运行吗?