程序在析构函数处崩溃
Program Crashing at Destructor
我似乎无法理解为什么我的程序运行成功然后在析构函数处崩溃。下面是我的 main() 源代码(相当简单,它将一个包含 5 个变量的数组发送到一个 class 模板,该模板创建了适当的类型。我做了一些研究,似乎遗漏了一些可能导致崩溃的东西因为析构函数的额外调用?我有点困惑,这很可能是一个简单的修复。
main.cpp:
int main()
{
// using integer data type
int arraya[5] = { 1, 2, 3, 4, 5 };
GenericArray<int> a(arraya, 5);
a.print();
// using float data type
float arrayb[5] = { 1.012, 2.324, 3.141, 4.221, 5.327 };
GenericArray<float> b(arrayb, 5);
b.print();
// using string data type
string arrayc[] = { "Ch1", "Ch2", "Ch3", "Ch4", "Ch5" };
GenericArray<string> c(arrayc, 5);
c.print();
return 0;
}
头文件内容:
#ifndef GENERIC_ARRAY_H
#define GENERIC_ARRAY_H
#include<string>
#include<iostream>
template<typename type>
class GenericArray
{
public:
GenericArray(type array[], int arraySize); // constructor
~GenericArray(); // destructor
void print(); // the print function
GenericArray(const GenericArray &obj); //copy constructor
private:
type *ptr; //new pointer of respective type
int size;
};
template<typename type>//print() function
void GenericArray<type>::print()
{
for (int index = 0; index < size; index++)
{
cout << ptr[index] << " ";
}
cout << endl;
}
template<typename type>//Constructor
GenericArray<type>::GenericArray(type array[], int arraySize)
{
size = arraySize;
ptr = new type[size];
ptr = array;
}
template<typename type>//Destructor
GenericArray<type>::~GenericArray()
{
cout << "Freeing Memory!";
delete[] ptr;
}
template<typename type>//Copy Constructor
GenericArray<type>::GenericArray(const GenericArray &obj)
{
*ptr = *obj.ptr;
}
#endif
-在print()
方法中:
在内存位置 ptr ... (ptr + size - 1)
分配了内存是不安全的,因此您可能 运行 出现段错误。
-在constructor
:
您通过 new
分配内存,但随后立即将您的指针重定向到与 array
指向的相同位置。 .这意味着你有内存泄漏。
-在destructor
:
如前所述,当调用 destructor
时,您的程序会在此处崩溃,因为 delete[] 不会对使用 new
分配的内存进行操作,请参阅 constructor
备注.
-在copy constructor
:
这里有两个问题。首先,你不能在这里取消引用 lhs-ptr
因为没有为他分配内存。此外,如果为 ptr
分配了内存,则语句 *ptr = *obj.ptr;
只会将 obj.ptr
的第一个元素(如果在此位置也分配了内存)复制到 obj.ptr
的第一个元素ptr
.`
构造函数定义不正确。他们应复制源对象的元素。
例如
#include <algorithm>
//...
template<typename type>//Constructor
GenericArray<type>::GenericArray( const type array[], int arraySize )
: ptr( new type[arraySize] ), size( arraySize )
{
std::copy( array, array + arraySize, ptr );
}
template<typename type>//Copy Constructor
GenericArray<type>::GenericArray( const GenericArray &obj )
: ptr( new type[obj.size] ), size( obj.size ),
{
std::copy( obj.ptr, obj.ptr + arraySize, ptr );
}
还需要定义复制赋值运算符。
我似乎无法理解为什么我的程序运行成功然后在析构函数处崩溃。下面是我的 main() 源代码(相当简单,它将一个包含 5 个变量的数组发送到一个 class 模板,该模板创建了适当的类型。我做了一些研究,似乎遗漏了一些可能导致崩溃的东西因为析构函数的额外调用?我有点困惑,这很可能是一个简单的修复。
main.cpp:
int main()
{
// using integer data type
int arraya[5] = { 1, 2, 3, 4, 5 };
GenericArray<int> a(arraya, 5);
a.print();
// using float data type
float arrayb[5] = { 1.012, 2.324, 3.141, 4.221, 5.327 };
GenericArray<float> b(arrayb, 5);
b.print();
// using string data type
string arrayc[] = { "Ch1", "Ch2", "Ch3", "Ch4", "Ch5" };
GenericArray<string> c(arrayc, 5);
c.print();
return 0;
}
头文件内容:
#ifndef GENERIC_ARRAY_H
#define GENERIC_ARRAY_H
#include<string>
#include<iostream>
template<typename type>
class GenericArray
{
public:
GenericArray(type array[], int arraySize); // constructor
~GenericArray(); // destructor
void print(); // the print function
GenericArray(const GenericArray &obj); //copy constructor
private:
type *ptr; //new pointer of respective type
int size;
};
template<typename type>//print() function
void GenericArray<type>::print()
{
for (int index = 0; index < size; index++)
{
cout << ptr[index] << " ";
}
cout << endl;
}
template<typename type>//Constructor
GenericArray<type>::GenericArray(type array[], int arraySize)
{
size = arraySize;
ptr = new type[size];
ptr = array;
}
template<typename type>//Destructor
GenericArray<type>::~GenericArray()
{
cout << "Freeing Memory!";
delete[] ptr;
}
template<typename type>//Copy Constructor
GenericArray<type>::GenericArray(const GenericArray &obj)
{
*ptr = *obj.ptr;
}
#endif
-在print()
方法中:
在内存位置 ptr ... (ptr + size - 1)
分配了内存是不安全的,因此您可能 运行 出现段错误。
-在constructor
:
您通过 new
分配内存,但随后立即将您的指针重定向到与 array
指向的相同位置。 .这意味着你有内存泄漏。
-在destructor
:
如前所述,当调用 destructor
时,您的程序会在此处崩溃,因为 delete[] 不会对使用 new
分配的内存进行操作,请参阅 constructor
备注.
-在copy constructor
:
这里有两个问题。首先,你不能在这里取消引用 lhs-ptr
因为没有为他分配内存。此外,如果为 ptr
分配了内存,则语句 *ptr = *obj.ptr;
只会将 obj.ptr
的第一个元素(如果在此位置也分配了内存)复制到 obj.ptr
的第一个元素ptr
.`
构造函数定义不正确。他们应复制源对象的元素。
例如
#include <algorithm>
//...
template<typename type>//Constructor
GenericArray<type>::GenericArray( const type array[], int arraySize )
: ptr( new type[arraySize] ), size( arraySize )
{
std::copy( array, array + arraySize, ptr );
}
template<typename type>//Copy Constructor
GenericArray<type>::GenericArray( const GenericArray &obj )
: ptr( new type[obj.size] ), size( obj.size ),
{
std::copy( obj.ptr, obj.ptr + arraySize, ptr );
}
还需要定义复制赋值运算符。