我发现这个在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上,这似乎仍然有效,我不确定这是不是因为 异常以某种方式被放弃,或者我根本不理解字符串是如何工作的。
有人可以帮忙解释一下吗?
答案 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
大小的一部分,您不需要自己分配。