C++ C++;:向量<;字符串>*args=新向量<;字符串>;(); 导致西格布特

C++ C++;:向量<;字符串>*args=新向量<;字符串>;(); 导致西格布特,c++,new-operator,stdvector,sigabrt,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 argu

非常不言自明。以下是导致“新向量”行出现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;
}
vector*任务::参数(){
vector*args=new vector();//导致SIGABRT
int count=sizeof(_参数);
对于(int x=0;xpush_back(参数);
}
返回args;
}
请注意,在其他地方,我称之为确切的一行,没有任何问题。以下是任务类中包含的列表:

#include <vector>
#include <unistd.h>
#include <string>
using namespace std;
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#包括
#包括
#包括
使用名称空间std;
#包括
#包括
#包括

有什么想法吗?

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

此代码中没有真正的错误,尽管样式表明您迫切需要一个

正如@James在对问题的评论中所说,使用动态分配的向量对象几乎肯定是错误的,不将其保存在智能指针中肯定是错误的

如果您在代码的其他地方也这样做过,那么您很可能已经把堆弄乱了,这是我能想到的唯一一种情况,当
new
崩溃时

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

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


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

< P> <代码> int计数= sieZof(x参数);<代码>似乎很可疑

sizeof
以字节为单位提供大小,而不是数组中的元素数(每个元素正好是一个字节的情况除外,即
char


干杯&hth.,

为什么要动态分配
std::vector
?几乎可以肯定,您应该使用局部变量并按值返回它。毕竟包括指令。另请看,主要问题是,履行机构在其最初评论中的语气表明,在他做出假设之前,他并不关心实际发生了什么。认真对待那个答案是我的错,但这并不能原谅他发布了一个傲慢的断章取义的答案。然而,问题已经解决,我愿意原谅和忘记;我只敦促人们不要做出假设或断章取义的回答,尤其是那些“声誉”很高的人——人们会认真对待你的答案,所以不要让人们在一个错误假设的基础上进行一次大雁追逐。检查一下我的答案——如果这样做是错误的,那么C++设计者比我想象的更困惑……JFM:我们不会为技术的准确性做出适中的回答。你们必须自己解决这个问题。我不能把这当作一个答案,而是用户的个人假设。我们非常不幸的是,一个拥有如此高声誉的人发布了如此断章取义的回复。我相信,这篇文章所写的事实上是一个设计指南,但并不是有意的,也不应该被视为解决这个特殊问题的方法。我不需要这样做——事实证明,它只是在这一行上显示了错误,因为GDB对错误的实际位置感到困惑。这实际上是我能够修复的for()循环中的一个逻辑错误。1)我看不出
for
循环有任何错误。你能详细说明一下吗?2) 没有人说使用动态向量会弄乱堆。然而,所有这样做的人都是愚蠢的。3) 如果所有对你来说没有意义的事情都是毫无意义的,那么这个世界将是一个愚蠢的世界。幸运的是,情况并非如此。3) 我建议您搜索解释如何使用动态分配对象的问题。我相信以前有人问过很多次。(如果您找到的答案并没有首先说明堆栈对象在任何可能的情况下都是首选的,那么这些答案是错误的。)正如其他评论中提到的,这只是一种糟糕的风格。至少您应该以passby引用的形式返回字符串,例如参数(vector*retval),并且可以使用retval->swap(my_vec)作为快速返回它的方法。动态分配没有什么错——您应该避免返回已分配对象的模式。我建议初学者阅读“Effective C++”。for循环失败,因为_参数是字符**,所以sizeof(_参数)只返回8(或者在过时的32位系统上返回4),而不是数组的大小。因为它以null结尾,所以我只使用了一段时间,直到结果为null。1)好吧,我们没有显示
\u参数,所以我们无法对此进行推理。2) 在手动管理动态分配的资源时,您可能会出错,从而导致堆栈混乱。混乱堆栈是<>代码>新< /代码>崩溃的唯一原因,我在C++ 20年中已经看到了。3)在C++中,你。总之,你从一个非常无知的POV看C++,而不考虑你的无知,限制你的判断能力。学习,而不是评判。如果这里有任何傲慢的东西,这是你最后的一次机会