我不清楚为什么会失败,为什么它失败的地方:
std::string* s;
s = (std::string*)malloc(sizeof(std::string) * 10);
s[0] = "string0";
s[1] = "string1";
s[2] = "string2"; //Segmentation fault
分配给s [0] - s [2]的字符串的大小是什么,或者malloc的多少空间无关紧要。 QStrings也发生了同样的事情。我认为麻烦来自std :: string包含内部指针的事实,因此sizeof()只返回指针的大小,但是假定std :: strings的行为类似于值(=,==等。我不明白为什么这会导致失败。
另外,为了与其他代码兼容,我需要在这里使用C数组,而不是的std ::向量。我正在寻找一个通用的解决方案(可以使用QString,QDateTime等),如果有的话。但我很高兴知道发生了什么。
编辑:得到了一个downvote ...这个问题出了什么问题?我确实先看了一会儿(包括SO),没有发现这个问题。
答案 0 :(得分:10)
你不能malloc
一个类对象数组,因为这个函数不会调用任何构造函数。你只需要用垃圾填充内存,然后尝试将其重新解释为类对象数组。
C ++对象的数组分配有new[]
。
关于与其他代码的兼容性,您可能可以使用std::vector
,因为&vec[0]
为您提供指向连续数组中第一个元素的指针。
如果你坚持使用malloc
和free
,那么你需要为每个数组项手动调用构造函数,并在释放之前手动调用每个析构函数。
答案 1 :(得分:5)
问题是std :: string有一个必须被调用的构造函数。
不是说拥有一个字符串数组是一个好主意,但如果你必须:
string* s = new string[10];
答案 2 :(得分:3)
问题出现是因为你不应该使用malloc为带有构造函数的类(比如std :: string)分配空间,除非你真的知道你在做什么。这样做很简单,并使用新的
std::string* s;
s = new std::string[10];
s[0] = "string0";
s[1] = "string1";
s[2] = "string2";
你的代码无法工作的技术原因是你没有构造任何字符串,因为你没有调用它们的构造函数,你所拥有的只是一块未初始化的内存。另一方面,new会在它分配的内存上调用std :: string构造函数。
答案 3 :(得分:1)
,不调用std :: string的构造函数。这可能是原因。顺便说一下,为什么在使用std :: string时使用malloc来分配内存?什么阻止你使用新的?
答案 4 :(得分:1)
如上所述:
You can not malloc an array of class objects, because this
函数不会调用任何构造函数。你只是填补了记忆 使用垃圾,然后您尝试将其重新解释为类的数组 对象。
如果您想要[作为解决方法],请执行以下操作:
char * s [10];
for(int i = 0; i< 10; i ++)s [i] = new char [10];
strcpy(s [0],“string0”);
strcpy(s [1],“string1”);
strcpy(s [2],“string2”);
答案 5 :(得分:0)
你可能想要的是一个字符串向量:
std::vector<std::string> s(3);
s[0] = "string0";
s[1] = "string1";
s[2] = "string2";
另外,为了与其他代码兼容,我需要在这里使用C数组,而不是的std ::矢量
您可以获取指向第一个元素的原始指针,以便与遗留代码进行互操作:
string* p = &s[0];