C ++ delete []调用析构函数
编辑:添加构造函数和析构函数。
编辑:这是泄漏:
c:userssijaandesktop1starray.cpp(61) : {148} normal block at 0x007C0910, 40 bytes long.
Data: < h | > C8 00 00 00 02 00 00 00 68 09 7C 00 CD CD CD CD
c:userssijaandesktop1starray.cpp(43) : {145} normal block at 0x007C04B0, 40 bytes long.
Data: <d { > 64 00 00 00 01 00 00 00 A8 E2 7B 00 CD CD CD CD
c:userssijaandesktop1starray.cpp(24) : {143} normal block at 0x007C0150, 816 bytes long.
Data: < X { > 80 00 00 00 58 E1 7B 00 CE CD CD CD CE CD CD CD
Object dump complete.
我试图在每次调用此函数后创建一个新对象:
bool StArray::addCS_Course(int StudentID, int CourseID, char * CourseName, int HwNum, double HwWeigh, int Flag, char * BookName)
{
for (int i = 0; i < MAX_STUDENT_NUM; i++) {
if (StArray_[i] == NULL) continue;
if (StArray_[i]->getID() == StudentID) {
CS_Course* New_CS = new CS_Course(CourseID, CourseName, HwNum, HwWeigh, Flag, BookName);
StArray_[i]->addCS_Course(New_CS);
return true;
}
}
return false;
}
我应该用新来做这个吗? 或者构造函数本身使得一个对象在这个函数之外被使用?
这是类声明:
class CS_Course : public Course {
public:
/*Interface functions*/
/* *****************************************************
Function: CS_Course
Abstract: constructor
Parameters:
Course_Id : course number
Course_Name : course name
Hw_Num : homeworks number
Hw_Weigh : the weigh of the homeworks
Return Value:
***************************************************** */
CS_Course(int Course_ID, char* Course_Name, int Hw_Num, double Hw_Weigh, int flag, char* BookName); // constructor
~CS_Course();
private:
int flag_;
char* BookName_;
我问这是因为当我删除CourseName字符串和BookName时,我仍然有一个新的分配对象,它没有任何东西。 然后我做这个: delete[] pCSC[j];
pCSC有指向CS_Course的指针。 但是我得到一个错误,因为这个删除调用了CS_Course析构函数,它试图销毁我已经销毁的CourseName。
这是构造函数:
CS_Course::CS_Course(int Course_ID, char * Course_Name, int Hw_Num, double Hw_Weigh, int flag, char * BookName)
:Course(Course_ID, Course_Name, Hw_Num, Hw_Weigh), flag_(flag)
{
BookName_ = new char[strlen(BookName) + 1];
strcpy(BookName_, BookName);
}
这是析构函数:
CS_Course::~CS_Course()
{
delete[] BookName_;
}
因为你传递了一个指向新创建的对象的指针,所以这里需要new
东西。 如果你正在创建一个局部变量并传递它,它不会在这个函数外部可用。
另外,确保在不再需要时delete
对象(即将其从阵列中删除)。 否则会造成内存泄漏。
你已经习惯C并且现在切换到C ++,不是吗?
编辑:
你经常不需要分配任何东西:
class CS_Course : public Course {
public:
CS_Course(int Course_ID, char* Course_Name, int Hw_Num, double Hw_Weigh, int flag,char* BookName)
:Course(Course_ID, Course_Name, Hw_Num, Hw_Weigh), flag_(flag), BookName(BooName)
{
}
private:
int flag_;
std::string BookName_;
};
在函数中分配数据结构是C中无法避免的,但在C ++中! 切勿在现代C ++代码中使用原始的new
代码!
使用新的智能指针,如std::unique_ptr
和std::shared_ptr
。
他们允许你做你想做的事情,没有任何关于双重删除的问题。
也尽量不要使用内置的C数据类型。 使用std::string
而不是char*
,即const std::string &
而不是const char*
和std::vector
或std::array
而不是内置数组!