我初始化一个指向字符串类型的指针并使用malloc函数分配一些内存。我的问题是,当我尝试使用此指针指向的字符串之一时,我得到分段错误。
string anyString = "anyWords";
string *pointerToString;
pointerToString = (string *) malloc(sizeof(string) * 5);
pointerToString[i] = anyString; // this line causes segmentation fault
提前感谢您的帮助。
答案 0 :(得分:5)
std::vector<std::string> strings(5);
这就是你真正想要的。
答案 1 :(得分:4)
避免将malloc
与C ++中的对象一起使用。
相反,请使用new
:
std::string * str = new std::string("Hello");
// ...
delete str;
对于数组:
std::string * tab = new std::string[5];
// ...
delete[] tab; // if you allocated with new[], release with delete[]
在这种情况下失败的原因是malloc
与new
不同,不会调用类的构造函数。由于std::string
自己分配内存,因此最终会得到一个无效的对象。
所以,new
/ delete
(或new[]
/ delete[]
)就是这样的方式。如果需要,您仍然可以使用malloc
,但仅限于“POD”类型(基本类型,旧样式结构等)。如果您使用malloc
进行分配,请使用free
发布。不要混淆new
和free
或malloc
和delete
(此规则有例外情况:请参阅下面的Mehrdad Afshari评论)。
答案 2 :(得分:0)
正如Etienne所说,你应该使用 new ,因为malloc只分配内存但不调用初始化该内存的构造函数。 std :: string是一个类,当你想在堆上创建它的实例时,你必须使用 new ,就像任何其他类类型一样。 您试图写入错误的地址,因此您的分段错误。
您想要创建字符串数组。在C中,您将使用数组,但在C ++中使用std :: vector。
答案 3 :(得分:0)
您可能不希望这样做,但如果您这样做,即使用malloc分配内存,那么您需要使用placement-new。
实际上,这将为您安排新的位置。
std::vector< std::string > vec;
vec.reserve( 5 );
vec.resize( 5 );
对reserve()的调用为你分配内存,然后resize()实际上在已经分配的内存中创建了对象,并使用placement-new。
这里记录了Placement new in the C++ FAQ。阅读它来学习。然后可能只是使用矢量。