C ++指向字符串类型分段错误的指针

时间:2010-12-21 14:52:58

标签: c++

我初始化一个指向字符串类型的指针并使用malloc函数分配一些内存。我的问题是,当我尝试使用此指针指向的字符串之一时,我得到分段错误。

string anyString = "anyWords";
string *pointerToString;
pointerToString = (string *) malloc(sizeof(string) * 5);
pointerToString[i] = anyString; // this line causes segmentation fault

提前感谢您的帮助。

4 个答案:

答案 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[]

在这种情况下失败的原因是mallocnew不同,不会调用类的构造函数。由于std::string自己分配内存,因此最终会得到一个无效的对象。

所以,new / delete(或new[] / delete[])就是这样的方式。如果需要,您仍然可以使用malloc,但仅限于“POD”类型(基本类型,旧样式结构等)。如果您使用malloc进行分配,请使用free发布。不要混淆newfreemallocdelete(此规则有例外情况:请参阅下面的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。阅读它来学习。然后可能只是使用矢量。