c++ - 我应该删除一个指针吗?

标签 c++ pointers

所以我要做一个项目,我需要实现一个array,一个listbinary heap二叉树红黑树,然后测量它们的性能,比较它们并得出一些结论。现在,规则是这样的:

  1. 必须使用 C/C++
  2. 不能使用std::(仅cout,可能是string),Boost

所以我正处于第一步,实现一个数组。它看起来像这样:

array.h

#pragma once
#include <iostream>
class array
{
    int elements;
    int *table;
public:
    array();
    array(int *t, int n);
    int size() const;
    int *get() const;
};

数组.cpp

#include "array.h"    

array::array(int *t, int n) : elements(n), table(new int[elements])
{   
    memcpy(table, t, elements * sizeof(int));
}

int array::size() const
{
    return elements;
}

int *array::get() const
{
    return table;
}

该程序基本上具有类似菜单的结构,使用简单的 switch 和针对 5 个竞争者的 5 个不同菜单。现在,我必须实现删除/添加元素、打印出数组等。我有一段代码可以在一行中打印出数组:

int *p = myArray.get();
int s = myArray.size();
std::cout << "[";
for (int i = 0; i < myArray.size(); i++)
{
    if (s - i == 1) std::cout << *(p + i) << "]" << '\n';
    else std::cout << *(p + i) << ", ";
}
delete p;

我很好奇的是我写的最后一行。首先,我没有使用 delete,因为这段代码中没有任何地方存在 new 运算符。但后来我想,是的,它很可能会导致内存泄漏,因此我添加了该行。双向工作。我的问题是:哪一个是正确的?在这种情况下,我是否拥有或应该删除一个指针

最佳答案

任何时候你使用new(或new[]),你都需要匹配的delete(或delete[]), 所以需要在某处删除array::table指向的数组。 array 的析构函数通常是执行此操作的地方,因为 array 拥有该数据。这样,只要 array 超出范围,您的 array 的数据就会被删除。请记住 rule of three尽管。如果您的类拥有某些资源,您应该覆盖默认的复制构造函数、复制运算符和析构函数。

您似乎误解了delete 的作用。 delete 删除动态分配的对象,而不是指针。在执行 int *p = myArray.get(); 之后,您会遇到以下情况:

+-----------+
|  myArray  |
| +-------+ |  +-------+
| | table | |  | p     |
| +---+---+ |  +-------+
+-----|-----+  |
      | +------+
      | |
     +v-v-----------------------+
     |       allocated data     |
     +--------------------------+

当您调用 delete[] tabledelete[] p 时,您将得到以下结果:

+-----------+
|  myArray  |
| +-------+ |  +-------+
| | table | |  | p     |
| +---+---+ |  +-------+
+-----|-----+  |
      | +------+
      | |
      v v

      Nothing here anymore, but the pointers still point here.

myArray.tablep 指向的数组都消失了,所以在指针上调用 delete[] 时的行为是指向用于保存该数组的内存的指针未定义。

关于c++ - 我应该删除一个指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42545089/

相关文章:

c++ - 将 vector 作为参数传递给函数

c - ValedasFloresRetail.exe : 0xC0000005: Access violation writing location 0x00000000 中 0x775615de 的未处理异常

c - 从内部结构到相同类型的其他结构的指针数组

c++ - 在 OpenCV 中计算 ROI 内的对象区域

c - 如何调试链表程序?

ofstream的C++ vector ,如何写入一个特定元素

c++ - 迭代 vector 不会更新对象

c++ - 这个类的析构函数是什么样的?

c++ - 具有动态数组分配的 OpenMP 嵌套循环

c++ - SSE整数除法?