如何在malloc()结构中使用C ++string?
我写了下面的示例程序,但它崩溃与段错误。 问题似乎是在结构中使用malloc
和std::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;
上面使用的new
forms被称为“放置新”。 然而,在你的情况下,没有必要这么做。
对于class
或struct
(如您的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));