尝试删除指针会触发断点
Trying to delete pointers triggers breakpoints
我正在研究的程序的目的是创建一个类,通过模拟指针的动态数组来"改进"默认的整数数组数据类型。 在尝试删除指针和指针数组时,我不断遇到错误,其中显示"Windows 在 project4.exe 中触发了断点。
这可能是由于堆损坏,这表示 project4.exe 或其加载的任何 DLL 中存在错误。
这也可能是由于用户在 project4.exe 具有焦点时按 F12。
输出窗口可能包含更多诊断信息。
class Array
{
private:
int length;
int* data;
public:
Array();
Array(const Array &cpy);
~Array();
bool addint(int toadd);
bool deletelast();
int getlength();
friend ostream& operator<<(ostream &out, const Array &n);
};
ostream& operator<<(ostream &out, const Array &n);
Array::Array()
{
length = -1;
data = NULL;
}
Array::Array(const Array &cpy)
{
length = cpy.length; //value of length is copied
if (length < 0)
data = NULL;
else
{
data = new int [length];
for (int i=0; i<=length; i++)
data[i] = cpy.data[i];
}
}
Array::~Array()
{
if (length != 0)
delete [] data;
else
delete data;
data = NULL;
}
bool Array::addint(int toadd)
{
length ++;
int* point = new int[length];
for (int i=0; i < length; i++)
point[i] = data[i];
point[length] = toadd;
if (length != 0)
delete [] data;
data = point;
point = NULL;
return true;
}
bool Array::deletelast()
{
int* temppoint;
if (length > 0)
temppoint = new int [length-1];
else
temppoint = new int[0];
for (int i=0; i<length; i++)
temppoint[i] = data[i];
if (length == 0)
temppoint[0] = 0;
length --;
delete [] data;
data = temppoint;
temppoint = NULL;
return true;
}
void menu(Array var)
{
int selection=0,
input;
bool success;
Array* arrcpy;
while (selection != 3)
{
if (var.getlength() == -1)
{
cout << "What would you like to demonstrate?" << endl << "1) Add an integer " << endl
<< "2) Exit" << endl << "Enter your selection: ";
cin >> selection;
if (selection == 2)
selection = 4;
}
else
{
cout << endl << "Now what would you like to demonstrate?" << endl << "1) Add an integer " << endl
<< "2) Delete the last entered integer" << endl << "3) Copy constructor" << endl << "4) Exit" << endl << "Enter your selection: ";
cin >> selection;
}
if (selection==1)
{
cout << endl << "The length of the array before adding a new value is: " << var.getlength() + 1 << endl;
cout << "Please enter the integer that you wish to add: ";
cin >> input;
success = var.addint(input);
if (success)
cout << endl << "The data input was a success!" << endl << "The length of the array is now: "
<< var.getlength() + 1 << endl << "The new value of the array is: " << var << endl;
else
cout << endl << "The input failed" << endl;
}
if (selection == 2)
{
cout << endl << "The lenght of the array before the deletion is: " << var.getlength() + 1 << endl
<< "and the value held in the array is: " << var << endl;
success = var.deletelast();
if (success)
cout << endl << "The data deletion was a success!" << endl << "The length of the array is now: "
<< var.getlength() + 1 << endl << "The new value of the array is: " << var << endl;
else
cout << endl << "The deletion failed" << endl;
}
if (selection == 3)
{
cout << endl << "The lenght of the array being copied is: " << var.getlength() + 1 << endl
<< "and the value held in the array is: " << var << endl;
arrcpy=new Array(var);
cout << endl << "The length of the copied array is: " << arrcpy->getlength() +1 << endl
<< "and the value contained in the array is: " << *arrcpy;
delete arrcpy;
}
}
}
这是我遇到的问题的所有相关源代码。 即将出现的是,delete
运算符和delete []
运算符的每个实例都导致了此断点错误,我不确定我做错了什么。
编辑:重写了代码,使长度值默认为 0 而不是 -1,现在一切正常!
我相信
复制构造函数中的for (int i=0; i<=length; i++)
应该包含i<length
(小于、不小于或等于)。 这是一个明显的问题。
此外,您正在传递addint()
方法中的边界。 数组中的最后一个元素位于索引 [length-1] 处。
int* point = new int[length];
由于您的长度从 -1 开始,因此此行的第一个调用将是执行 new int[0]
。可能是问题所在。如果你坚持不修复length
的语义,你想在这里length+1
无关的一点,你应该看看std::vector
是如何做到的,而不是重新分配每一个添加,你应该尝试过度分配,只有在空间被填满时才重新分配。
我知道这是一个旧线程,我承认我没有阅读所有评论,但是关于为什么当长度更改为 0 时它似乎有效的主题我相信这可能是由于向大小无效的数组提供了 nullptr,稍后,尝试删除此类指针会导致断点。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- 无法删除指针,已触发断点
- 尝试删除指针会触发断点
- 删除char阵列指针触发了一个神秘的断点
- 带有字符指针的 2D 数组的断点
- 动态分配的 int 数组的共享指针触发了断点
- C++ Winsock2 错误指针断点触发
- 在 Visual Studio 2005 中对取消引用的指针的地址设置数据断点