c++ - 内存是如何分配的,又是如何释放的?

标签 c++ memory-management memory-leaks

我有一个类A我创建了一个指针:

A * const q = reinterpret_cast<A * const>(new char[2 * sizeof(A)]);

我有 2 个对象:

new (q)A;
new (q + 1) A;

如果我像这样删除指针:

  • delete q;它调用了一次 A 的析构函数
  • delete[] reinterpret_cast<char *>(q);没有~A()的电话
  • delete q; delete (q+1);没关系,订单崩溃了
  • delete [] q也在崩溃

正确的做法,我觉得是这样的:

q->~A();
q[1].~A();
delete[] reinterpret_cast<char *>(q);

谁能告诉我内存分配/解除分配的原因以及发生了什么?

最佳答案

当然,您不能在实例上调用 delete,因为它假设它将执行 new 的计数器并释放内存。它不知道您已使用 placement-new 为对象分配后备存储。我认为最后的片段也是正确的:运行析构函数,并手动释放内存,因为只有您知道它来自哪里。

关于c++ - 内存是如何分配的,又是如何释放的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21333315/

相关文章:

c++ - 是否有适用于 Windows (Visual C) 的 unistd.h 的替代品?

c++ - C++ `free` 函数是线程安全的吗?

memory-management - JVM 和 CLR 分配优化

c++ - 将一个 vector 复制到其他 C++ 时出错

python - 如何记录每个请求的 Django 应用程序的内存使用情况

c++ - soci给出 fatal error :mysql.h:没有这样的文件或目录

c++ - QPainter性能高帧率

c++ - 将整数参数从 Vb6 传递到 C++ dll

java - Guice 3.0 + Tomcat 7.0 = ClassLoader 内存泄漏

c - Valgrind 报告 OS X 10.8.1 内存泄漏