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_ptrstd::shared_ptr

他们允许你做你想做的事情,没有任何关于双重删除的问题。

也尽量不要使用内置的C数据类型。 使用std::string而不是char* ,即const std::string &而不是const char*std::vectorstd::array而不是内置数组!

链接地址: http://www.djcxy.com/p/82813.html

上一篇: C++ delete[] calls destructor

下一篇: Explicitly deleting destructors and not calling delete