c++:删除不同的静态和动态指针类型

C++ : deleting different static and dynamic pointer type

本文关键字:动态 指针 类型 静态 删除 c++      更新时间:2023-10-16

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

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. 除了编码约定,这段代码还会导致哪些问题?

int没有构造函数,char也没有。然而,由于操作符delete(更准确地说是delete [])的使用与操作符new (new [])的使用不匹配,因此行为是未定义的。

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

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

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

所以这样的代码可能导致的问题可能是....任何东西……甚至什么都没有。最大的问题是你不一定知道。