C++指针和动态数组以及删除运算符
C++ Pointers and Dynamic Arrays and Delete Operator
好的,所以我将布置两个程序。 两者都是使用指针和 new 运算符的动态数组。 但是人们似乎不喜欢删除运算符。
#include <iostream>
int main()
{
int *p;
p = new int[5];
for (int i = 0; i < 5; i++)
{
p[i] = 25 + (i * 10);
std::cout << p[i] << " ";
}
std::cout << std::endl;
delete [] p;
p = NULL;
return 0;
}
这是第一个程序。 它喜欢删除运算符就好了。 现在不喜欢删除运算符的程序:
#include <iostream>
int main()
{
int x;
int *p;
p = new int[5];
*p = 4;
for (int i = 0; i < 5; i++)
{
std::cout << *p << " ";
x = *p;
p++;
*p = x + 1;
}
std::cout << std::endl;
delete [] p;
p = NULL;
return 0;
}
这个程序编译得很好。 但是在执行过程中,它会抛出一个错误 -free(): invalid pointer: 0xfdb038
.或任何特定执行的内存地址。所以,问题是: 为什么在第二种情况下不能使用删除运算符? 我不想有内存泄漏;我不希望指针悬空。 如果我只是说p = NULL;
,那么p = 0
,但我相信指针仍然悬空?,但我不确定。 提前谢谢。
看看第二段代码中的这个循环:
for (int i = 0; i < 5; i++)
{
std::cout << *p << " ";
x = *p;
p++;
*p = x + 1; // <--- Here
}
请注意,在此行中,您写入当前由p
指向的内存地址。由于您总是递增p
然后写入它,因此您最终会在您为p
分配的区域末尾之后注销。(如果我们把pOrig
想象成指向p
最初指向的位置的指针,那么这将写入pOrig[1]
、pOrig[2]
、pOrig[3]
、pOrig[4]
和pOrig[5]
,并且最后一次写入是超过区域的末尾)。这会导致未定义的行为,这意味着实际上任何事情都可能发生。这是个坏消息。
此外,delete[]
假定您正在传入指向您分配的数组的第一个元素的指针。由于您在该循环中p
增加了很多倍,因此您尝试delete[]
不在分配数组底部的指针,因此存在问题。
要解决此问题,请不要在递增后写入p
,并存储指向分配了new[]
的原始数组的指针,以便您可以释放该数组而不是修改后的指针p
。
您必须delete
从new
获得的指针。但是,在第二个代码中,您执行了更改指针p++
。因此,您尝试delete
一个没有从new
中获得的指针,并delete
崩溃。
要修复此类错误,切勿使用new
。而是使用std::vector<int> p;
.因为你永远不需要new
所以你不能忘记一个delete
。
问题正在更改p++
中的p
。 您应该始终存储(删除)原始指针。喜欢这个:
#include <iostream>
int main()
{
int *original = new int[5];
int *p = original;
for (int i = 0; i < 5; i++)
{
std::cout << *p << " ";
int x = *p;
p++;
*p = x + 1;
}
std::cout << std::endl;
delete [] original;
return 0;
}
- 为什么 std::make_shared 无法编译带有已删除运算符 new 的类型?
- 无效删除运算符语法
- C++:如果我重载新运算符,我是否也必须重载删除运算符?
- C++自定义删除运算符不能正常工作?
- 为什么我们甚至需要删除运算符?(我们不能只使用删除[]吗)
- 除了调用全局删除运算符之外,删除一个void指针还能做什么呢
- 在这里使用删除运算符是否正确,我很困惑
- 删除运算符
- 使用空实现重写删除运算符
- C ++(为什么)确实移动构造函数删除运算符=
- 如何在 C++ 中使用删除运算符删除单个数据
- 如何通过带有指向基类的指针的删除运算符释放内存
- 删除运算符如何在我的代码中工作
- C++ - 定义自定义新建和删除运算符时make_shared
- 将删除运算符放置在何处以进行动态变量
- C++删除运算符而不"new"
- 如何使用删除 [] 运算符清除动态分配的内存?(无法使用常规删除语法清除)
- 为什么删除运算符在const上下文中使用
- c++是否需要在用户定义和类特定的删除运算符中处理nullptr
- C++ 在覆盖新运算符和删除运算符时不释放数据