所以我要做一个项目,我需要实现一个array
,一个list
,binary heap
,二叉树
和红黑树
,然后测量它们的性能,比较它们并得出一些结论。现在,规则是这样的:
- 必须使用 C/C++
- 不能使用
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[] table
或 delete[] p
时,您将得到以下结果:
+-----------+
| myArray |
| +-------+ | +-------+
| | table | | | p |
| +---+---+ | +-------+
+-----|-----+ |
| +------+
| |
v v
Nothing here anymore, but the pointers still point here.
myArray.table
和 p
指向的数组都消失了,所以在指针上调用 delete[]
时的行为是指向用于保存该数组的内存的指针未定义。
关于c++ - 我应该删除一个指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42545089/