我认为应该允许我“删除”指针,但抛出了一个错误“使用中的块”
Thinking I should be allowed to `delete` a pointer but an error is thrown `block in use`
考虑这个函数:
bool RemoveElement(const T2& e2)
{
bool match = false;
for (int i = 0; i < _trenutno; i++)
{
if (*_elementi2[i] == e2){
match = true;
for (int j = i; j < _trenutno - 1; j++)
{
_elementi1[j] = _elementi1[j + 1];
_elementi2[j] = _elementi2[j + 1];
// SOLUTION: The two lines above are not correct.
// Instead of assigning addresses, I should have assigned
// values, ie. dereference them like below:
// *_elementi1[j] = *_elementi1[j + 1];
// *_elementi2[j] = *_elementi2[j + 1];
}
}
}
if (match)
{
_trenutno--;
//delete _elementi1[_trenutno];
_elementi1[_trenutno] = nullptr;
//delete _elementi2[_trenutno];
_elementi2[_trenutno] = nullptr;
}
return match;
}
仅供参考,指针本身(见下文)。我在上面的函数中尝试使用delete
删除这对特定指针(最后一个元素)后面的值,因为否则我认为会发生内存泄漏?
template<class T1, class T2, int max>
class Kolekcija
{
T1* _elementi1[max];
T2* _elementi2[max];
int _trenutno;
public:
Kolekcija()
{
for (int i = 0; i < max; i++)
{
_elementi1[i] = nullptr;
_elementi2[i] = nullptr;
}
_trenutno = 0;
}
// ...
~Kolekcija()
{
for (int i = 0; i < _trenutno; i++){
delete _elementi1[i]; _elementi1[i] = nullptr;
delete _elementi2[i]; _elementi2[i] = nullptr;
}
}
// ....
为什么会发生这种情况,我想了解更多,更好地理解指针。
如果您的类是data owner
,并且您想要删除一些元素:
- 查找元素
(_elementi1[nFound] == searchValue)
的索引 - 从堆
delete _elementi1[nFound];
中删除此元素 - 将元素的值设置为
nullptr
_elementi1[nFound] = nullptr;
- 只有这样,才能将尾部元素移动到已移除项目的位置
此序列将保护您免受Remove
方法中的内存泄漏。
析构函数将清除其他堆分配的值(假设_trenutno
是实际的count
):
for (int i = 0; i < _trenutno; i++)
{
delete _elementi1[i]; _elementi1[i] = nullptr;
delete _elementi2[i]; _elementi2[i] = nullptr;
}
删除nullptr
即为safe
。
所以我的Remove()
:版本
bool RemoveElement(const T2& e2)
{
for (int i = 0; i < _trenutno; i++)
{
if (*_elementi2[i] == e2)
{
delete _elementi1[i];
_elementi1[i] = nullptr;
delete _elementi2[i];
_elementi2[i] = nullptr;
for (int j = i; j < _trenutno - 1; j++)
{
_elementi1[j] = _elementi1[j + 1];
_elementi2[j] = _elementi2[j + 1];
}
_trenutno--;
return true; //found
}
}
return false; //not found
}
我假设你的收藏品是data owner
。所以您have to
delete
所有传递给它的指针。简单的例子(我们加了3个值):
int* elements[max] = {0};
elements[0] = new int(4); //0x00FF1F
elements[1] = new int(5); //0x00FF2F
elements[2] = new int(6); //0x00FF3F
_trenutno = 3;
我们必须delete
所有3个int*
如果没有调用Remove
,析构函数将处理它(从0
删除到2
)。
如果我们调用Remove(5)
:
- 找到
5
值i == 1
的索引 - 呼叫
delete elements[1]
,表示releaze memory at address 0x00FF2F
- 交接班:
elements[1] = elements[2]
现在我们的阵列是:
elements[0]; //0x00FF1F
elements[1]; //0x00FF3F
elements[2]; //0x00FF3F
并且_trenutno=2;
因此,析构函数将删除从"0"到"1"的指针。
这是删除的所有3个指针!
这里有很多问题,首先你需要删除项,然后为数组中的那个位置设置nullptr值,如果我想像你的情况一样使用T1和T2的数组,那么我会使用向量而不是简单的数组
相关文章:
- 试图修复一个错误,该错误不会让我开始编程其余部分
- MSVC 无法根据模板参数进行数学运算,这是一个错误吗?
- 我正在尝试一个傻瓜 C++ 练习,我遇到了一个错误,说类 'GraduateStudent' 没有任何名为 'advisor' 的字段
- 零四元数和任何向量都不为零的特征积,这是一个错误吗?
- 处理程序的模块列表中有一个错误的模块"WebSocketModule"
- 在 C++ 中使用 "transform" 会给出一个错误,指出这未在作用域中声明
- 在Cython中使用C库时,我遇到了一个错误
- 我需要帮助创建一个评分系统,但它一直给我一个错误,注释掉的整数是给我带来麻烦的部分
- 我试图用c++编写递归fibonacci序列,但当我编译时,我遇到了一个错误
- 从system()调用G++会返回一个错误
- 在Visual Studio中,与std::async一起使用时不调用"thread_local"变量"析构函数,这是一个错误吗?
- 我收到一个错误无效的操作数,类型为 const char [42] 和二进制"运算符+"的双倍数
- 使用声明:GCC 和 Clang 的另一个错误?
- 全球免费给出一个错误.调试器不解释
- 相对于继承的构造函数,gcc 编译器是否还有一个错误?
- 为什么直接传递"this"指针来存档是一个错误,而另一个相同类型的指针是可以的?
- 为什么第三板有一个错误
- 如何编写一个错误结构,该结构可以包含不同的强键枚举作为错误代码
- 使用本地类型声明的G lambda被使用但从未定义 - 确实是一个错误
- 我需要在 Android Studio 中构建 NDK. 但它返回一个错误