2010-12-21 68 views
0

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

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

在此先感谢您的帮助。

+0

'我'的价值是什么? – 2010-12-21 14:55:34

+2

你应该扔掉任何源头教你在这里使用malloc。 – 2010-12-21 15:05:53

回答

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发布。不要混淆newfreemallocdelete(有一个例外:见下文迈赫达德Afshari的评论)。

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

这就是你真正想要的。

0

正如Etienne所说,你应该使用新的作为malloc只分配内存,但不调用初始化该内存的构造函数。 std :: string是一个类,当你想在堆上创建它的实例时,必须使用新的,就像其他任何类类型一样。 你试图写错地址,因此你的分段错误。您要创建字符串数组。在C中,你将使用数组,但在C++中使用std :: vector。

0

你可能不希望做这样的说法,但如果你是,即使用malloc分配内存,那么你需要使用放置新的。

其实,这是不行的布局,新的为您服务。

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

调用储备()分配给你的内存,然后调整()实际上会在内存中有物体已经分配的,放置新的。

Placement new in the C++ FAQ很好地记录在这里。阅读它来学习。那么可能只是使用矢量。