删除新位置

Sak*_*ham 7 c++

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

int* x = new int[2];
char* ch = new(x) char();
*ch = 't';
delete ch;
Run Code Online (Sandbox Code Playgroud)

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

int x[2];
char* ch = new(x) char();
*ch = 't';
delete ch;
Run Code Online (Sandbox Code Playgroud)

所以问题清单是:

  • 是否由于堆栈上的删除调用而导致异常?
  • 在堆栈上的内存块上使用new new是没关系的吗?
  • 如果是,那么我该如何删除字符指针.
  • 是否可以使用placement new在单个内存块上分配多个变量?

小智 16

是否由于堆栈上的删除调用而导致异常?

是.虽然为了澄清一点,但这不是C++的例外.这是运行时检测到的错误.如果运行时不是那么聪明,那么你也可能遇到未定义的行为.

在堆栈上的内存块上使用new new是没关系的吗?

是.你也可以看看alloca()变长数组(VLA) -这些都是在栈中分配内存的另外两个机制.请注意,VLA是C99的一部分,而不是C++ 11(及更早版本)的标准,但大多数生产级编译器都支持它作为扩展(可能出现在C++ 14中).

如果是,那么我该如何删除字符指针.

你不应该.当您使用新的展示位置时,您不会调用delete,只需调用析构函数即可.对于任何o类型的给定对象,T您需要调用o->~T();而不是delete o;.如果必须,然而,处理调用的代码delete或者delete []这样的对象,您可能需要重载运营商delete,并delete[]和使这些运营商束手无策(析构函数已经运行在这一点).

是否可以使用placement new在单个内存块上分配多个变量?

是.但是,您需要格外小心以确保符合对齐要求.