C++ : deleting different static and dynamic pointer type

标签 c++

<分区>

我有一段愚蠢的代码,需要一些解释。

int main() {
   int *ptr_i = new int[100];
   char *ptr_c = (char *)ptr_i;
   delete [] ptr_c;
   return 0;
}

首先,我原以为这段代码会崩溃,但我认为它并没有崩溃,因为在这种情况下,分配器将跟踪要取消分配的字节数。我也在这段代码上运行了 valgrind,它没有显示内存泄漏。 我需要澄清以下内容:

  1. 如果处理 POD 数据类型,char 的 c'tor 与 int 的 c'tor 有何不同?

  2. 除了编码规范之外,这段代码还会导致什么其他问题?

最佳答案

intchar 都没有构造函数。但是,由于运算符 delete(更准确地说是 delete [])的用法与运算符 new 的用法(new [ ]) 行为未定义。

未定义的行为并不意味着会发生崩溃。这并不意味着会发生内存泄漏。

这只是意味着 C++ 标准对发生的事情没有任何限制。

可能会或可能不会发生崩溃。可能会或可能不会发生内存泄漏。编译器可能会也可能不会重新格式化您的硬盘。您的程序可能会也可能不会打印值 42 总共 27 次。您可以想象的任何其他事件可能会发生,也可能不会发生。

因此此类代码可能导致的问题可能是......任何......甚至什么都没有。最大的问题是你不一定知道。

关于C++ : deleting different static and dynamic pointer type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38851843/

相关文章:

c++ - OpenProcessToken 在 ImpersonateLoggedOnUser 后失败

c++ - 通过 typedef 显式模板实例化

c++ - C++ 中的 "Ch++"或 "ch+1"?

c++ - outData.txt 没有输出正确的值

c++ - 为什么 std::unique_lock 同时提供模板和 MoveConstructible?

c++ - 可变参数宏和参数包扩展

c++ - 如何用某种类型创建 NULL?

c++ - 使用默认参数转发引用?

c++ - C++在目录中对文件名进行排序

c++ - boost MPL 以生成对象序列化代码?