如何在malloc()结构中使用C ++string?

我写了下面的示例程序,但它崩溃与段错误。 问题似乎是在结构中使用mallocstd::string s。

 #include <iostream> #include <string> #include <cstdlib> struct example { std::string data; }; int main() { example *ex = (example *)malloc(sizeof(*ex)); ex->data = "hello world"; std::cout << ex->data << std::endl; } 

我无法弄清楚如何使它工作。 任何想法,如果甚至可以使用malloc()std::string s?

谢谢,Boda Cydo。

你不能在C ++中使用非平凡的构造函数malloc 。 你从malloc得到的是一块原始的内存,它不包含一个正确构造的对象。 任何使用该内存作为“真实”对象的尝试都将失败。

而不是malloc -ing对象,使用new

 example *ex = new example; 

您的原始代码也可以强制使用malloc ,通过使用以下步骤:首先malloc原始内存,在该原始内存中构build对象第二:

 void *ex_raw = malloc(sizeof(example)); example *ex = new(ex_raw) example; 

上面使用的newforms被称为“放置新”。 然而,在你的情况下,没有必要这么做。

对于classstruct (如您的example ,正确的答案是使用new而不是malloc()来分配实例。 只有operator new知道如何调用struct及其成员的构造struct 。 你的问题是由于string成员没有被构造。

然而,在极less数情况下,一个特定的内存补丁就像拥有一个类的实例一样重要。 如果真的有这样的情况,那么operator new有一个变化,允许指定对象的位置。 这被称为“放置新的” ,必须非常小心使用。

 void *rawex = malloc(sizeof(example)); // allocate space example ex = new(rawex) example(); // construct an example in it ex->data = "hello world"; // use the data field, not no crash // time passes ex->~example(); // call the destructor free(rawex); // free the allocation 

通过使用新的位置,您有义务提供正确大小和alignment的内存区域。 不提供正确的大小或alignment将导致神秘的事情出错。 不正确的alignment通常会更快地导致问题,但也可能是神秘的。

另外,新增一个放置位置,您负责手动调用析构函数,并根据内存块的来源将其释放给其所有者。

总而言之,除非你已经知道你需要一个新的位置,你几乎肯定不需要它。 它具有合法的用途,但是框架的angular落不明确,而不是每天都出现。

问题是malloc不会调用example的构造函数。 由于string通常表示为堆栈上的指针,因此将其设置为零,并且您将取消引用空指针。 你需要使用new

malloc分配内存不会调用任何构造函数。 不要将C风格的分配与C ++对象混合在一起 。 他们不能一起玩。 相反,使用new运算符来分配C ++代码中的对象:

 example *ex = new example; 

这是更聪明的代码,将调用std::string::string()构造函数初始化string,这将修复您看到的段错误。 当你完成释放内存并调用合适的析构函数时,不要忘记删除它:

 delete ex; 

你不应该使用

例子* ex =(example *)malloc(sizeof(* ex));

因为什么sizeof(* ex)返回等于long的大小或int的大小,这是由于你不同的编译环境。 你可以使用代码如下:

例子* ex =(example *)malloc(sizeof(example));