具有指针成员和内存分配的类

时间:2016-01-15 11:37:55

标签: c++

我对包含指向char的指针的类有一点问题。这是班级。

//Header file
class NOTE{
private:
    char * m_Description;
public:
    NOTE();
    NOTE( string description );
    NOTE( const NOTE & copy );
    ~NOTE();

    void SetDescription( string description );
    string GetDescription() const;
};

//Cpp File
NOTE :: NOTE() : m_Description( nullptr ){ }

NOTE :: NOTE( string description ) 
      : m_Description( new char[ description.size() + 1 ] )
{
    strcpy( m_Description , description.c_str() );
}

NOTE :: ~NOTE(){ delete [] m_Description; }

NOTE :: NOTE( const NOTE & copy )
      : m_Description( new char[ strlen( copy.m_Description ) + 1 ] ) //Here my program fails
{
      strcpy( this->m_Description , copy.m_Description );
}

string NOTE :: GetDescription() const {
      return string( m_Description );
}

void NOTE :: SetDescription( string description ){
      strcpy( m_Description , description.c_str() );
}

程序尝试复制NOTE时出现错误,并且在为指针分配新内存时停止。您是否发现代码有任何问题?

我的另一个疑问是SetDescription方法:在调用strcpy之前,是否必须为指针分配新内存?

编辑:我的问题不是编译问题,这是一个运行时问题。

4 个答案:

答案 0 :(得分:1)

首先回答第二个问题,因为你有一个默认构造函数NOTE(),它将指针初始化为NULL,你应该检查这个指针是否为NULL,如果它是分配内存,或者我相信你可能有一个分段错误。 编辑:正如在评论中所解释的,检查null是不够的,因为即使已经分配了大小要求也可能不同

对于第一个问题,您可以编辑以显示有关程序失败的更多信息。请记住,您正在访问一个私有元素(char指针),但这是允许的,因为它是同一个类

答案 1 :(得分:1)

您的代码存在问题,完全在它失败的行中:您的复制构造函数将一个潜在的NULL指针传递给strlen,而不进行任何检查:

 m_Description( new char[ strlen( copy.m_Description ) + 1 ] ) // copy.m_Description may be NULL

这也可以解释你的问题。

答案 2 :(得分:0)

结合所有评论和答案,我们可以断言

  1. 您错过了)和行m_Description( new char[ description.size() + 1 ]的结尾。
  2. 在方法SetDescription内,您必须首先检查m_Description是否为NULL。如果不是,请删除当前的内存预留。在这两种情况下都为新描述保留内存(new char[ description.size() + 1 ])。
  3. 更新

    这是{{3}}。

答案 3 :(得分:0)

一些“值得思考的东西”!!

  1. 当然,如果没有足够的内存,就不要搞乱字符指针。
  2. 在strcpy之后,不要忘记将“\ 0”附加到char *
  3. 知道当你在免费商店中管理对象时,你需要实现一个赋值运算符,析构函数等.a.k.a三/五规则。
  4. 在执行strcpy之前,请检查输入是否为空! (特别是在您的代码失败的地方!!)