【问题标题】:Delete object inside the class C++ [closed]删除类 C++ 中的对象 [关闭]
【发布时间】:2014-09-04 09:10:36
【问题描述】:

我的课程中有一部分用于逐字节读取数据,直到出现'\0'

RESULT MyClass::readMethod(DataInputStream& s)    
{
    if ( condition = ok )
    {   
        char tmp[32];
        uint8 i = 0;
        do {
            tmp[i] = s.read_int8();
        } while (tmp[i++] == '\0');

        char *arr= new char[i];

        for (uint8 j = 0; j < i; ++j)
        {
            arr[j] = tmp[j];
        }
        //delete[] arr;
    }
}

我为这篇文章删除了很多代码,因为其余部分不太重要。
我的问题是,我想释放内存,但是因为我有方法:

我试过把它放入析构函数中:

MyClass::~MyClass()
{
    delete [] arr;
}

但是编译器(我使用 Visual Studio 2010)在下面划线并说:"Error: identifier arr is undefined".
我不能在评论的地方使用它,因为我有以下方法:

char * getArr()
{
    return arr;
}

但是,我不知道它是否会起作用,我的意思是,如果我可以在课堂外访问arr。我还在学习 C++ 和 OOP,有时我很困惑。
与构造函数类似的问题:如何将arr 初始化为空。

【问题讨论】:

  • arr 的有效期应该是多久?谁负责删除它?如果该类负责,则该类需要在某处保存它的副本,以便以后可以将其删除。 (为什么要标记C?)
  • 如果不需要,避免使用指针,在这种情况下使用std::string。而arr 对析构函数来说是未知的,因为它是readMethod() 的局部变量
  • 如果没有名为arr 的成员,char * getArr() { return arr; } 如何编译?
  • char *arr= new char[i];readMethod() 的本地。使其成为类成员变量,以便从类的其他成员函数中访问它。
  • arr 是存储 PIN 码的数组。只要有人决定删除它并更改 PIN(删除arr,然后再创建一个),它就应该保留——这就是我想使用析构函数的原因。我不知道谁应该为此负责,这是问题之一。如何在某处复制以稍后将其删除?我删除了c'c'标签,对不起,点击了'suggested'。

标签: c++ class constructor destructor


【解决方案1】:

您的 arr 对于 readMethod 是本地的。所以析构函数不知道它。您必须将 arr 声明为类成员。

class MyClass
{

  private:
     char* arr;
}

然后你可以在你的析构函数中删除它。

【讨论】:

  • 没错,谢谢。由于我研究了这么久,我忘了用类声明修改 .h 文件。顺便说一句,我很伤心,我的很多 C++ 帖子都被否决了,我不知道为什么,所以我不能做出更好的帖子 :(
  • @Kappa "...所以我无法发布更好的帖子"您可能需要先read this,然后再发布您的下一个问题。
猜你喜欢
  • 2021-01-26
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 2017-05-07
  • 2013-09-09
  • 2023-02-08
相关资源
最近更新 更多