C ++ delete []调用析构函数

时间:2016-01-05 20:49:53

标签: c++ destructor operator-keyword

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_;
}

2 个答案:

答案 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_ptrstd::shared_ptr等新的智能指针。

它们允许您完全按照您的要求进行双重删除。

还尝试不使用内置的C数据类型。使用std::string代替char*,即const std::string &代替const char*std::vectorstd::array,而不是内置数组!