std :: string和placement new

use*_*218 4 c++ string placement-new

我发现这个在C++中使用placement new的例子,对我来说没有意义.我认为这个代码容易出现异常,因为可能会使用比分配的内存更多的内存.

char *buf  = new char[sizeof(string)];
string *p = new (buf) string("hi");
Run Code Online (Sandbox Code Playgroud)

如果"string"是C++ STD :: string类,那么buf将得到一个空字符串对象大小的分配(我的编译器提供28个字节),然后我用它来初始化你的字符串的方式你可能超过分配的内存.例如:

string *p = new (buf) string("hiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
Run Code Online (Sandbox Code Playgroud)

在我的VS上,这似乎仍在工作,我不确定这是因为异常是以某种方式放弃,或者我根本不理解字符串是如何工作的.

有人可以帮忙澄清一下吗?

Eri*_*ski 7

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

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

public:
    // normal interface methods
};
Run Code Online (Sandbox Code Playgroud)

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


Bri*_*ian 5

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

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