std :: string和placement new

时间:2014-05-27 01:35:58

标签: c++ string placement-new

我发现这个在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上,这似乎仍然有效,我不确定这是不是因为 异常以某种方式被放弃,或者我根本不理解字符串是如何工作的。

有人可以帮忙解释一下吗?

2 个答案:

答案 0 :(得分:7)

您误解了std :: string的(典型)内部实现。通常它实现了这样的事情:

class string {
protected:
    char *buffer;
    size_t capacity;
    size_t length;

public:
    // normal interface methods
};

关键是存在两个不同的内存块:一个用于string对象本身,包含上面显示的成员,另一个用于字符串的内容。当您执行展示位置new时,它只是放置在提供的内存中的字符串对象, buffer的内存,其中的内容为字符串存储。这是由string类根据需要自动分配的。

答案 1 :(得分:5)

sizeof返回的大小是存储类成员所需的字节数,以及一些实现定义的填充。必须在调用std::string的构造函数之前分配该内存。

但是,当构造函数运行时,它可能会分配更大量的内存,实际上它必须存储大字符串。该内存量不是sizeof大小的一部分,您不需要自己分配。