3

很不言自明。这是导致“新向量”行出现 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

4 回答 4

6

这段代码没有真正的错误,尽管风格表明你迫切需要一本好的 C++ 书

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

于 2011-02-16T17:38:11.717 回答
3

好的,事实证明问题不在于向量分配,而在于 for() 循环内部。用适当的 do/while 循环替换它可以修复它。GDB 只是对错误的位置感到困惑,并将其卡在矢量线上……呃。不过考虑到 STL 的使用,这并不奇怪。

另外,对于那些说动态分配向量会弄乱堆的人来说——为什么?这没有任何意义;我不在乎是否动态分配每个对象;这样做不应该引起问题。过去混合堆和堆栈对象给我带来了很多问题;我能让事情始终如一地工作的唯一方法是使用所有堆对象。

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

于 2011-02-19T23:00:18.050 回答
3

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

sizeof为您提供以字节为单位的大小,而不是数组的元素数(除非每个元素恰好是一个字节,即char)。

干杯&hth.,

于 2011-02-20T23:12:01.930 回答
2

在您执行此调用之前,可能有其他东西损坏了堆。您是否尝试过在 valgrind 或同等工具下运行?

于 2011-02-16T17:27:55.993 回答