C++ 删除带有指向该指针的指针的指针 请仔细考虑一下: 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;

C++ 删除带有指向该指针的指针的指针 请仔细考虑一下: 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;,c++,pointers,new-operator,delete-operator,C++,Pointers,New Operator,Delete Operator,有没有办法用del指针删除新分配的hello和bye内存。。。这些可以清除hello和bye指向的数据 如果我正确理解了你的问题,那么你问题第一部分的答案如下: ... int * * hello_ref = &hello; delete[] *hello_ref; ... 关于第二部分,你完全按照你的要求做了。那两个就可以了。只需添加delete[]del;最后一步。您只需删除del引用的数组: 您已经在删除hello和bye引用的数组: 虽然这会更为惯用: delete

有没有办法用del指针删除新分配的hello和bye内存。。。这些可以清除hello和bye指向的数据

如果我正确理解了你的问题,那么你问题第一部分的答案如下:

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

关于第二部分,你完全按照你的要求做了。那两个就可以了。只需添加delete[]del;最后一步。

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

您已经在删除hello和bye引用的数组:

虽然这会更为惯用:

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

或者更好,避免使用新的和完全删除,利用现代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);
}

你在实际代码中使用这个吗?看起来你应该使用std::vector,这样你就不用担心管理了。hello[i]比*hello+i…读起来更好。我没有投反对票,但问题不清楚。你到底在问什么?我不明白你在问什么,但第一个例子是释放内存后访问内存的未定义行为,因此可能会崩溃或给出错误的结果。这实际上是对的,但这清楚地表明,这是一个指针,我们现在是我们,但你不是…这不起作用。。将此添加到第二部分,并查看….删除[]del;对于寄存器int i=0;i<4;i++cout@Parano delete只是释放数组使用的内存;它不会将数组的元素归零。你所做的是非法的未定义的行为,但它不一定会告诉你。@Parano,你只是打印出了一些没有问题的记忆。使用此数据将导致未定义的行为。另请参见Joseph Thomson之前的评论。我们仍然为hello and bye分配了内存。。。检查…现在它们的值是MAX_UNSIGNED INT,但仍然有exist@Parano删除阵列后,无法通过检查阵列的元素来判断是否仍在分配内存。也许会是零,也许不会。也许你的电脑会崩溃,或者你的硬盘会被擦除。访问已删除数组的元素是未定义的行为。此外,C++是为了效率而设计的;在释放内存之前,没有理由将数组归零,因此不要期望它。请检查调试器中是否可以在其他行中继续执行程序,然后将watcher或breakpoint设置为其他行…@Parano您仍然可以在调试器中检查数组。如果您在调试模式下运行,元素可能会被设置为一些默认值,以便您可以轻松地看到它们已被删除。也许MAX_UNSIGNED_INT就是这个值。但是如果只是用new创建一个数组并用delete删除分配的内存,我们就看不到这种行为。。。同意这个?
delete[] * del; 
delete[] * (del + 1);
delete[] del[0];
delete[] del[1];
#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);
}