删除带有指向该指针的指针的指针
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);
有什么方法可以删除 hello 和 bye 的新分配内存,使用指向指针的 del 指针...这些可以清除 hello 和 bye 指向的数据....
如果我正确理解你的问题,那么你问题第一部分的答案将是这样的:
...
int * * hello_ref = &hello;
delete[] *hello_ref;
...
关于第二部分,你完全按照你的要求做了。这 2 delete
完成了这项工作。最后添加 delete[] del;
。
你只需要删除del
引用的数组:
delete[] del;
您已经删除了 hello
和 bye
:
引用的数组
delete[] * del;
delete[] * (del + 1);
虽然这样会更地道:
delete[] del[0];
delete[] del[1];
或者更好的是,避免同时使用 new
和 delete
,利用现代 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);
}
考虑一下:
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 指向的数据....
如果我正确理解你的问题,那么你问题第一部分的答案将是这样的:
...
int * * hello_ref = &hello;
delete[] *hello_ref;
...
关于第二部分,你完全按照你的要求做了。这 2 delete
完成了这项工作。最后添加 delete[] del;
。
你只需要删除del
引用的数组:
delete[] del;
您已经删除了 hello
和 bye
:
delete[] * del;
delete[] * (del + 1);
虽然这样会更地道:
delete[] del[0];
delete[] del[1];
或者更好的是,避免同时使用 new
和 delete
,利用现代 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);
}