gpt4 book ai didi

c++ - 删除放置新

转载 作者:可可西里 更新时间:2023-11-01 18:16:08 26 4
gpt4 key购买 nike

我知道对使用 placement new 创建的变量调用 delete 然后访问该内存块具有未定义的行为。

int* x = new int[2];
char* ch = new(x) char();
*ch = 't';
delete ch;

但是如果在堆栈上分配内存块而不是堆,然后我们对该变量调用 delete 然后访问内存,我会得到一个异常,提示 block 类型无效

int x[2];
char* ch = new(x) char();
*ch = 't';
delete ch;

所以问题列表是:

  • 异常是由于在堆栈上调用 delete 引起的吗?
  • 在堆栈上的内存块上使用 placement new 可以吗?
  • 如果是那么我该如何删除字符指针。
  • 是否可以在单个 block 上分配多个变量内存使用新的位置?

最佳答案

Is the exception due to call of delete on a stack?

是的。虽然要澄清一点,但这不是 C++ 异常。这是运行时检测到的错误。如果运行时不是那么智能,您也可能会遇到未定义的行为。

Is it fine to use placement new on memory block on stack?

是的。您也可以看看 alloca()Variable-length arrays (VLA) - 这是另外两种在堆栈上分配内存的机制。请注意,VLA 是 C99 而不是 C++11(及更早版本)标准的一部分,但作为扩展被大多数生产级编译器支持(它可能出现在 C++14 中)。

If yes then how shall I delete the character pointer.

你不应该。当你使用一个新的放置时,你不会调用 delete,你只是调用一个析构函数。对于类型为 T 的任何给定对象 o,您需要调用 o->~T(); 而不是 delete o;。但是,如果您必须处理在此类对象上调用 deletedelete [] 的代码,您可能需要重载运算符 deletedelete[] 并让这些操作符什么也不做(此时析构函数已经运行)。

Is it possible to assign multiple variables on a single block of memory using placement new?

是的。但是,您需要格外小心,以确保满足 alignment requirements .

关于c++ - 删除放置新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17640064/

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