gpt4 book ai didi

c++ - 我可以简单地在分配的内存上调用构造函数,而不是放置新的吗?

转载 作者:行者123 更新时间:2023-11-30 00:48:18 26 4
gpt4 key购买 nike

所以我有一个类似容器的池类,它基本上是 std::vector<char*> blocks 的包装器,其中内存是通过执行以下操作分配的:

char* block = new char[elementSize * blockSize];
blocks.push_back( block );

这个池有一个 void* get_addr( std::size_t n )返回元素 n 的内存地址。

我知道,我可以通过以下方式构造一个新对象: new( get_addr(n) ) Object( args ) ;但我也可以这样做:

// Create a supplimentary method
T& get( std::size_t n ) { return *static_cast<T*>( get_addr(n) ); }
// ...
// ...
// and an example usage, where Object is arbitrary
Object& obj = pool.get( 10 );
obj = Object( args );

两种方法我都试过了,放置新方法当然有效,但是第二种构造方法也有效。所以我很感兴趣,为什么我不应该使用第二种方式是否有任何限制,或者这样做是否安全。

最佳答案

这样做是完全不安全的,因为您正在分配给一个未初始化的对象。这几乎会破坏任何复杂类型。

Placement new 实际上是在分配的内存上调用构造函数 - 这就是它的工作和目的。你问的问题根本没有意义。 “我如何在不使用 X 的情况下使用语言功能 X?”。你必须先构建对象,然后再对它们进行操作。

关于c++ - 我可以简单地在分配的内存上调用构造函数,而不是放置新的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31999223/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com