【发布时间】:2014-05-27 01:35:58
【问题描述】:
我发现了这个在 C++ 中使用placement new 的例子,这对我来说没有意义。 我认为这段代码很容易出现异常,因为可能会使用比分配更多的内存。
char *buf = new char[sizeof(string)];
string *p = new (buf) string("hi");
如果 "string" 是 C++ STD::string 类,那么 buf 将获得分配 空字符串对象的大小(我的编译器给出 28 个字节), 然后我看到的方式,如果你用更多的字符初始化你的字符串,你可能会 超过分配的内存。例如:
string *p = new (buf) string("hiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
在我的 VS 上,这似乎仍然有效,我不确定这是不是因为 以某种方式放弃了异常,或者我根本不明白字符串是如何工作的。
有人可以帮忙澄清一下吗?
【问题讨论】:
-
当
string("hiiii...")运行时,它可能会执行new char[]来获得额外的内存来存储文本,如果抛出那么重要的是p不是deleted(那将是未定义的行为)但buf是delete[]ed(否则会出现内存泄漏)。所以一切都好 - 容易出错,即使不是“容易发生异常”。
标签: c++ string placement-new