首页 > 解决方案 > 如何使用析构函数删除在类构造函数中分配的动态内存

问题描述

我正在尝试使用析构函数释放对象的内存。该内存是在对象声明时分配的。下面的代码片段是我正在制作的程序的综合版本,但它解释了我的问题。我知道问题是通过析构函数释放的,但我不知道异常的原因可能是什么。

#include <iostream>
using namespace std;
class student 
{
private:
    char const* firstname;
    char const* lastname;
public:
    student()
    {
        firstname = new char[10];
        lastname = new char[10];
        firstname = "HelloMaria";
        lastname = "Something";
    }
    void print()
    {
        cout << "Firstname =  " << firstname<<endl;
        cout << "Last name = " << lastname << endl;
    }
    ~student()
    {
        cout << "Destructor Called" << endl;
        delete[] firstname;
        delete[] lastname;
    }
};
int main()
{
    student obj1;
    obj1.print();
    system("pause");
    return 0;

}

标签: c++c++11visual-c++

解决方案


您的问题出在以下几行:

    firstname = new char[10];
    lastname = new char[10];
    firstname = "HelloMaria";
    lastname = "SomethingVe";

首先你设置firstnamelastname指向新分配的char数组,这很好......但是你立即将它们更改为指向静态分配的字符串。这意味着当您delete[]在析构函数中传递指向的指针时,您正在尝试删除从未分配过的字符串,这会调用未定义的行为。

处理字符串的正确方法是使用std::string而不是分配您自己的字符缓冲区,但如果由于某种原因您不能这样做,那么执行您尝试做的事情的下一个最佳方法将更像这样:

student()
{
    firstname = alloc_string_buffer("HelloMaria");
    lastname = alloc_string_buffer("SomethingVe");
}

private:
   // Helper function to allocate the right-sized char-buffer and 
   // copy the bytes from the passed-in literal string into the buffer
   char * alloc_string_buffer(const char * s)
   {
       size_t numBytesToAllocate = strlen(s)+1;  // +1 for the NUL terminator byte
       char * buf = new char[numBytesToAllocate];
       strcpy(buf, s);
       return buf;
   }

推荐阅读