删除新位置

时间:2013-07-14 14:01:59

标签: c++

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

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

但是如果内存块而不是堆在堆栈上分配然后我们在该变量上调用delete然后访问内存,我得到块类型无效的例外。< / p>

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

所以问题清单是:

  • 是否因为在堆栈上调用delete而导致异常?
  • 在堆栈上的内存块上使用new new是否可以?
  • 如果是,那么我该如何删除字符指针。
  • 是否可以在单个块上分配多个变量 内存使用贴装新?

1 个答案:

答案 0 :(得分:16)

  

是否由于在堆栈上调用delete而导致异常?

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

  

在堆栈上的内存块上使用new new是否可以?

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

  

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

你不应该。当您使用新的展示位置时,不要调用delete,只需调用析构函数即可。对于o类型的任何给定对象T,您需要拨打o->~T();而不是delete o;。但是,如果您必须处理在此类对象上调用deletedelete []的代码,则可能需要重载运算符deletedelete[]并使这些运算符执行什么都没有(析构函数已经在那一点上运行了。)

  

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

是。但是,您需要格外小心,以确保符合alignment requirements