EDITED:添加了构造函数和析构函数。
编辑:这是泄漏:c:\users\sijaan\desktop\1\starray.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:\users\sijaan\desktop\1\starray.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:\users\sijaan\desktop\1\starray.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;
}
我应该用new来做这个吗?或者构造函数本身使一个对象在这个函数之外使用?
这是班级宣言:
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时,我&#39;&#39;还有一个没有任何东西的新分配对象。
然后我这样做: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_;
}
答案 0 :(得分:0)
此处new
是必需的,因为您正在将指针传递给新创建的对象。如果您正在创建局部变量并将其传递,则在此函数外部不可用。
此外,请确保在不再需要时delete
对象(即,如果将其从阵列中删除)。否则会导致内存泄漏。
答案 1 :(得分:0)
你已经习惯了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
,而不是内置数组!