在使用 malloc 分配的结构中使用 C 字符串
使用 malloc 为 C 结构分配内存时,考虑数据的存在非常重要需要非平凡构造函数的成员,例如std::string.
问题和代码示例
考虑以下代码,该代码尝试为包含 std::string 成员的结构分配内存:
#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 成员处于未初始化状态。
解决方案:使用 C 内存分配运算符
为C对象分配内存的正确方法是使用C内存分配运算符,例如new和delete。这些运算符自动调用分配对象的构造函数和析构函数,确保正确的初始化和清理。
对于提供的代码,解决方案是将 malloc 替换为 new:
example *ex = new example;
替代方案:放置新
如果您需要使用 malloc 分配内存但仍想使用 C 构造函数,您可以使用placement new运算符:
void *ex_raw = malloc(sizeof(example)); example *ex = new(ex_raw) example;
placement new允许你在内存中的特定位置构造一个对象。但是,除非出于特定原因,否则不建议使用这种方法。
结论
在处理包含非平凡数据成员的 C 结构时,必须使用使用 new 和 delete 的正确内存分配技术可以避免未定义的行为或错误。
以上是如何为带有字符串成员的C结构正确分配内存?的详细内容。更多信息请关注PHP中文网其他相关文章!