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

时间:2016-08-09 13:15:27

标签: 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. 除了编码约定外,这段代码还会带来哪些其他问题?

1 个答案:

答案 0 :(得分:5)

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

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

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

可能会或可能不会发生崩溃。可能会也可能不会发生内存泄漏。编译器可能会也可能不会重新格式化您的硬盘驱动器。您的计划可能会或不会打印42个值27次。您可以想象的任何其他一组事件可能会也可能不会发生。

因此,这些代码可能导致的问题可能是......任何事情......甚至一无所获。最大的问题是你不一定知道。