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上,这似乎仍在工作,我不确定这是因为异常是以某种方式放弃,或者我根本不理解字符串是如何工作的.
有人可以帮忙澄清一下吗?
你误解了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班级根据需要自动分配的.
返回的大小sizeof是存储类成员所需的字节数,以及一些实现定义的填充.必须在std::string可以调用构造函数之前分配该内存.
但是,当构造函数运行时,它可能会分配更大量的内存,实际上它必须存储大字符串.内存量不是sizeof大小的一部分,您不需要自己分配.
| 归档时间: |
|
| 查看次数: |
1074 次 |
| 最近记录: |