EDITED: добавлен конструктор и деструктор.C++ delete [] calls destructor
EDIT: это утечка:
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;
}
я должен использовать новый, чтобы сделать это? или сам конструктор делает объект для использования вне этой функции?
Вот объявление класса:
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, I «» до сих пор новый выделенный объект, который не имеет ничего. Тогда я делаю это: delete[] pCSC[j];
У pCSC есть указатели на CS_Course. Но я получаю сообщение об ошибке, потому что это удаление вызывает деструктор CS_Course, который пытается уничтожить имя курса, которое я уже уничтожил.
Это конструктор:
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' /' new [] 'или' delete'/'delete []'. У вас есть действительно веская причина? –
Замечание: вы делаете (в большинстве случаев) что-то не так, когда вы помещаете выделенную память в контейнер (если вам нужен полиморфизм, вы должны использовать std :: unique_ptr или std :: shared_ptr) –
Тот факт, что вы не используете стандартные типы (например, 'std :: vector' или' std :: string') предполагает, что вы должны прочитать хороший учебник. Во всяком случае, в общем, избегайте использования 'new' и' delete', если это возможно. Если вы это сделаете, используйте интеллектуальные указатели, а не необработанные указатели. Однако, интересно, какое отношение к вам тема «delete [] вызывает деструктор». Если вы можете, пожалуйста, также извлеките минимальный пример, см. Руководство по публикации для получения дополнительной информации. –