动态分配C字符串数组

时间:2011-08-07 10:30:36

标签: c++ arrays string pointers

我不清楚为什么会失败,为什么它失败的地方:

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),没有发现这个问题。

6 个答案:

答案 0 :(得分:10)

你不能malloc一个类对象数组,因为这个函数不会调用任何构造函数。你只需要用垃圾填充内存,然后尝试将其重新解释为类对象数组。

C ++对象的数组分配有new[]

关于与其他代码的兼容性,您可能可以使用std::vector,因为&vec[0]为您提供指向连续数组中第一个元素的指针。


如果你坚持使用mallocfree,那么你需要为每个数组项手动调用构造函数,并在释放之前手动调用每个析构函数。

答案 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)

使用malloc

,不调用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];