繁体   English   中英

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

[英]C++ pointer to string type segmentation fault

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

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

在此先感谢您的帮助。

std::vector<std::string> strings(5);

这就是您真正想要的。

避免在C ++中将malloc与对象一起使用。

而是使用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的评论)。

正如Etienne所说,您应该使用new,因为malloc仅分配内存,而不调用构造函数来初始化该内存。 std :: string是一个类,当您要在堆上创建它的实例时,必须像其他任何类类型一样使用new 您试图写一个错误的地址,因此您的分段错误。

您要创建字符串数组。 在C语言中,您将使用数组,但在C ++语言中,请使用std :: vector。

您可能不希望那样做,但是如果要这样做,即使用malloc分配内存,则需要使用new-placement。

实际上,这将为您带来全新的展示位置。

std::vector< std::string > vec;
vec.reserve( 5 );
vec.resize( 5 );

对reserve()的调用为您分配了内存,然后resize()实际上在已分配的内存中在那里创建了对象,并带有了new-placement。

这里很好地记录了C ++常见问题中的新布局 阅读以学习。 然后可能只是使用向量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM