所以我必须做一个项目,我需要实现 an array、 a list、binary heap和binary treea red-black tree,然后测量它们的性能,比较它们并得出一些结论。现在,规则是这样的:
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;
};
Run Code Online (Sandbox Code Playgroud)
array.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;
}
Run Code Online (Sandbox Code Playgroud)
该程序基本上具有类似菜单的结构,使用简单的switch5 个不同菜单来表示 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;
Run Code Online (Sandbox Code Playgroud)
我很好奇的是我写的最后一行。首先我没有使用delete,因为这段代码中没有任何地方存在new运算符。但后来我想,是的,它很可能会导致内存泄漏,所以我添加了这一行。双向工作。我的问题是:哪一个是正确的?在这种情况下我是否有或者应该删除一个pointer?
任何时候使用new(或new[]) 时,都需要一个匹配的delete(或delete[]),因此需要删除array::table某处指向的数组。 array的析构函数是通常执行此操作的位置,因为array拥有该数据。这样,只要超出范围,您array的数据就会被删除。array但请记住三法则。如果您的类拥有某些资源,则应该覆盖默认的复制构造函数、复制运算符和析构函数。
你似乎误解了什么delete。 delete删除动态分配的对象,而不是指针。执行完后int *p = myArray.get();,出现以下情况:
+-----------+
| myArray |
| +-------+ | +-------+
| | table | | | p |
| +---+---+ | +-------+
+-----|-----+ |
| +------+
| |
+v-v-----------------------+
| allocated data |
+--------------------------+
Run Code Online (Sandbox Code Playgroud)
当您调用delete[] table或时delete[] p,您最终会得到以下结果:
+-----------+
| myArray |
| +-------+ | +-------+
| | table | | | p |
| +---+---+ | +-------+
+-----|-----+ |
| +------+
| |
v v
Nothing here anymore, but the pointers still point here.
Run Code Online (Sandbox Code Playgroud)
myArray.table和指向的数组都消失了,因此调用指向用于保存该数组的内存的指针p时的行为是未定义的。delete[]