我对包含指向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
之前,是否必须为指针分配新内存?
编辑:我的问题不是编译问题,这是一个运行时问题。
答案 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)
结合所有评论和答案,我们可以断言
)
和行m_Description( new char[ description.size() + 1 ]
的结尾。SetDescription
内,您必须首先检查m_Description
是否为NULL。如果不是,请删除当前的内存预留。在这两种情况下都为新描述保留内存(new char[ description.size() + 1 ]
)。更新
这是{{3}}。
答案 3 :(得分:0)
一些“值得思考的东西”!!