在这个 Informit C++ 指南中,我读到了这个:
malloc()
用于创建非 POD 对象会导致未定义的行为://disastrous! std::string *pstr =(std::string*)malloc(sizeof(std::string));
我不明白这里有两点:
- 指针是 POD。那为什么这里叫非POD呢?(也许我必须更好地理解 POD。)
- 怎么会这么惨?(我想我必须为此了解字符串内部。)
请解释!
在这个 Informit C++ 指南中,我读到了这个:
malloc()
用于创建非 POD 对象会导致未定义的行为://disastrous! std::string *pstr =(std::string*)malloc(sizeof(std::string));
我不明白这里有两点:
请解释!
指针是 POD 那么为什么在这里它被称为非 POD
它不是在谈论指针,而是在谈论std::string
.
这是灾难性的,因为malloc
不调用构造函数,因此您将有pstr
一个std::string
指向std::string
未正确构造的 a 的指针。由于缺少构造函数调用,内存已分配但未正确初始化。
正确的方法是
std::string *pstr = new std::string;
干净的方法是在自动存储中有一个变量:
std::string str;
在这里,您分配的是标准字符串,而不是分配指向标准字符串的指针。请注意,您正在传递sizeof(std::string)
给 malloc;那就是您要返回的内存量...注意对象的大小大于指针的大小。如果您只是分配一个指针,您会期望传入的大小为sizeof(std::string*)
.
您收到的指针是您跟踪分配结果的方式,但该指针并不存在于堆上。在这里,它只是存储在一个普通变量中。如果您分配了一个指针,那么您要跟踪它的变量将需要是一个指向指针的指针。
无论如何,如果你愿意,你可以合法地分配一个指向标准字符串的指针,如下所示:
std::string str;
std::string** ptr_to_pstr = (std::string**)malloc(sizeof(std::string*);
*ptr_to_pstr = &str;
为什么你会想要并不完全清楚。但也不清楚为什么要在 C++ 中使用 malloc。:)