删除带有指向该指针的指针

时间:2016-03-14 13:07:37

标签: c++ pointers new-operator delete-operator

好好考虑一下:

int * hello = new  int[10]; 
for (register int i = 0; i < 10; i++)
    *(hello + i) = i;
int * & hello_ref = hello; 
delete[] hello_ref ; 
for (register int i = 0; i < 10; i++)
    cout << *(hello + i) << std::endl; 

现在hello_ref可以成功删除由new分配的内存...从参考和指针非常接近的事实我们如何使用指向新内存的指针做同样的事情分配

现在考虑这个

int i = 0;
unsigned int * hello = new  unsigned int[6]; 
for (register int i = 0; i < 6; i++)
    *(hello + i) = i; 
unsigned int * bye = new  unsigned int[4];
for (register int i = 0; i < 4; i++)
    *(bye + i) = i; 
unsigned int ** del = new  unsigned int *[2];
*del = bye; 
*(del + 1) = hello; 
delete[] * del; 
delete[] * (del + 1); 

有没有什么方法可以删除新分配的内存用于hello和bye以及del指针指针...这些可以清除hello和bye指向的数据....

2 个答案:

答案 0 :(得分:2)

如果我理解你的问题,那么问题第一部分的答案将是这样的:

...
   int * * hello_ref = &hello;
   delete[] *hello_ref;
...

关于第二部分,你完全按照你的要求做了。那些2 delete完成了这项工作。只需添加delete[] del;即可。

答案 1 :(得分:2)

您只需要删除del引用的数组:

delete[] del;

您已删除hellobye引用的数组:

delete[] * del; 
delete[] * (del + 1);

虽然这会更惯用:

delete[] del[0];
delete[] del[1];

甚至更好,完全避免使用newdelete,充分利用现代C ++功能。你写的东西看起来更像是C。

#include <array>
#include <numeric>
#include <tuple>

template<typename T, std::size_t N>
std::array<T, N> make_increasing_array(T initial = T())
{
  std::array<T, N> array;
  std::iota(array.begin(), array.end(), initial);
  return array;
}

int main()
{
  auto del = std::make_tuple(
    make_increasing_array<unsigned int, 6>(),
    make_increasing_array<unsigned int, 4>());

  auto& hello = std::get<0>(del);
  auto& bye = std::get<1>(del);
}