
用Dev C++ 写C的时候,编译文件,出现这个问题,请问怎么修复?跳转到了另外一个文件,无法对原来想编译的文件进行编译。貌似动到了软件文件。求指教,感谢!

用Dev C++ 写C的时候,编译文件,出现这个问题,请问怎么修复?跳转到了另外一个文件,无法对原来想编译的文件进行编译。貌似动到了软件文件。求指教,感谢!
关注【相关推荐】
在堆区开辟内存存储数据时,new关键字的使用方式错误,将“[]”写为了“()”
在笔者将自己的代码与视频教程中的代码对比后,笔者发现了原因。
在有参构造函数、拷贝构造函数,以及重载赋值运算符函数这三个函数中,需要在堆区上开辟一段连续的内存,用来存储数组的元素。
要做到这一点,就需要使用new关键字
具体语法为:
接收指针p = new 数据类型 [元素个数]
其中,用来包含元素个数的是中括号“[]”
但笔者在代码中却使用了小括号“()”
以有参构造函数为例:
错误的写法:
template<typename T>
MyArray<T>::MyArray(int capacity)
{
this->m_arr = new T(capacity);//错误的写法
this->m_size = 0;
this->m_capacity = capacity;
}
正确的写法:
template<typename T>
MyArray<T>::MyArray(int capacity)
{
this->m_arr = new T[capacity];//正确的写法
this->m_size = 0;
this->m_capacity = capacity;
}
new T[capacity]的含义是,在堆区开辟大小为capacity个T类型数据的内存,并返回第一个数据的指针。
而new T(capacity)的含义则是,在堆区开辟大小为一个T类型数据的内存,将这个T类型数据的值初始化为capacity。
正是因为笔者写成了后者,所以才导致在测试时,以为创建了5个元素大小的数组,实际上只创建了一个值为5的元素。
而此时size又是5,自然会导致指针访问越界,从而触发断点。
int main()
{
MyArray<int> arr(5);
int capacity = arr.GetCapacity();
for (int i = 0; i < capacity; i++)
{
arr.PushBack(i);
}
int size = arr.GetSize();
for (int i = 0; i < size; i++)
{
cout << arr[i]<<endl;
}
}