簡體   English   中英

刪除帶有指向該指針的指針的指針

[英]Delete a pointer with a pointer to that pointer

那么考慮一下:

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); 

有什么辦法可以用指向指針的 del 指針刪除為 hello 和 bye 分配的新內存......這些可以只清除 hello 和 bye 指向的數據......

如果我正確理解您的問題,那么您問題第一部分的答案將是這樣的:

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

關於第二部分,你完全按照你的要求做了。 那些 2 delete完成這項工作。 只需添加delete[] del; 作為最后一步。

您只需要刪除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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM