3

这个 Informit C++ 指南中,我读到了这个:

malloc()用于创建非 POD 对象会导致未定义的行为:

//disastrous!
std::string *pstr =(std::string*)malloc(sizeof(std::string));

我不明白这里有两点:

  • 指针是 POD。那为什么这里叫非POD呢?(也许我必须更好地理解 POD。)
  • 怎么会这么惨?(我想我必须为此了解字符串内部。)

请解释!

4

2 回答 2

5

指针是 POD 那么为什么在这里它被称为非 POD

它不是在谈论指针,而是在谈论std::string.

这是灾难性的,因为malloc不调用构造函数,因此您将有pstr一个std::string指向std::string未正确构造的 a 的指针。由于缺少构造函数调用,内存已分配但未正确初始化。

正确的方法是

std::string *pstr = new std::string;

干净的方法是在自动存储中有一个变量:

std::string str;
于 2012-07-07T06:53:48.493 回答
1

在这里,您分配的是标准字符串,而不是分配指向标准字符串的指针。请注意,您正在传递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。:)

于 2012-07-07T07:03:14.887 回答