C++ 如何设计以char*指针作为类成员变量的类?
首先我想介绍一下我的情况: 我已经编写了一些类,这些类使用char*指针作为私有类成员。而且这个项目有GUI,所以当单击按钮时,一些函数可能会执行多次。这些类是在项目中设计的单个类。但是其中一些函数可以执行多次。然后我发现我的项目存在内存泄漏 因此,我想问以下问题:C++ 如何设计以char*指针作为类成员变量的类?,c++,memory-leaks,C++,Memory Leaks,首先我想介绍一下我的情况: 我已经编写了一些类,这些类使用char*指针作为私有类成员。而且这个项目有GUI,所以当单击按钮时,一些函数可能会执行多次。这些类是在项目中设计的单个类。但是其中一些函数可以执行多次。然后我发现我的项目存在内存泄漏 因此,我想问以下问题: 如何设计集合函数 如何设计使用char*成员变量的其他函数 如何设计类运算符=函数 例如: class A: { public : setStr(char * s){//need new or just use =?}; A
class A:
{
public :
setStr(char * s){//need new or just use =?};
A & operator=(const A& other){//also need new?};
manyTimesFunctions(char * other)
{
//need to use chars other to assignment str
//how to carefully use new to avoid memory leak?
//other may be another class's locality none const variable
}
private:
char * str;
}
因此,项目仅初始化一次A类,但可能多次使用setStr
和manyTimesFunctions
答案可能是:
我想我已经找到了我需要注意的:答案对我来说真的很有用。只要使用
std::string
。它为您管理内存。成员声明如下所示
std::string str;
void setStr( char const* s ) { str = s; }
setter函数如下所示
std::string str;
void setStr( char const* s ) { str = s; }
如果要使用字符串并需要一个char常量*
,只需编写str.c_str()
使用标准库类型,如std::string
,并且不需要手动动态分配,您通常不需要担心操作符=
:编译器生成的副本分配工作得很好
顺便说一句,决定成员变量的命名约定通常是个好主意。常见的C++包括:代码> STRUG、<代码> MSTR 、<代码> MyOSTR 。下划线后缀可能是最常见的,但不要使用像
\u str
这样的前导下划线,因为尽管技术上允许它与实现定义名称的约定相冲突(例如,全局命名空间中的标识符不允许使用前导下划线)。只需使用std::string
。它为您管理内存。成员声明如下所示
std::string str;
void setStr( char const* s ) { str = s; }
setter函数如下所示
std::string str;
void setStr( char const* s ) { str = s; }
如果要使用字符串并需要一个char常量*
,只需编写str.c_str()
使用标准库类型,如std::string
,并且不需要手动动态分配,您通常不需要担心操作符=
:编译器生成的副本分配工作得很好
顺便说一句,决定成员变量的命名约定通常是个好主意。常见的C++包括:代码> STRUG、<代码> MSTR 、<代码> MyOSTR 。下划线后缀可能是最常见的,但不要使用像
\u str
这样的前导下划线,因为尽管技术上允许它与实现定义名称的约定冲突(例如,全局命名空间中的标识符不允许前导下划线).我不能100%确定你想做什么。但是,由于char*是一个指针,您可以简单地传递引用
char* operator=(char* s) { str = s; }
只需知道,如果修改函数中的值,它将修改复制它的位置
如果char*实际上需要是一个克隆,这样它就不会修改原始值。首先需要获得字符*的长度
这可以通过此函数完成
unsigned Length(char* s)
{
unsigned I = 0;
while( *(s+I) != '\0')
I++;
return I;
}
可以按如下方式创建新字符串
str = new char[LENGTH];
此时,可以逐项复制字符串
for(I = 0 ; I < LENGTH; I++)
{
str[I] = s[I];
}
当然,使用std::string可以避免很多问题。我不能100%确定您要做什么。但是,由于char*是一个指针,您可以简单地传递引用
char* operator=(char* s) { str = s; }
只需知道,如果修改函数中的值,它将修改复制它的位置
如果char*实际上需要是一个克隆,这样它就不会修改原始值。首先需要获得字符*的长度
这可以通过此函数完成
unsigned Length(char* s)
{
unsigned I = 0;
while( *(s+I) != '\0')
I++;
return I;
}
可以按如下方式创建新字符串
str = new char[LENGTH];
此时,可以逐项复制字符串
for(I = 0 ; I < LENGTH; I++)
{
str[I] = s[I];
}
当然,使用std::string可以避免很多问题。此答案将用于对比给定状态下其他答案使用的
std::string
(这些答案是正确的——使用std::string
)
假设您只能使用char*
,由于某种原因不能使用std::string
,并且您正在处理以NULL结尾的字符串。这是您的实现必须做的事情的概要(请将其与简单使用std::string
)进行比较:
#包括
在添加了几个构造函数和一个getter函数之后,接下来是
您看到我们需要添加多少代码才能使类安全地可复制和可分配吗?这就是为什么当涉及到类成员时,使用std::string
比使用char*
方便得多。对于std::string
而言,与添加复制/分配(和移动,我没有显示)功能相比,需要更改一行
P> >在C++中,如果需要字符串,请使用字符串(<代码> STD::String ),尽量避免使用<代码> char */COD>(除非你有非常令人信服的理由使用<代码> char */COD>来表示字符串数据)。给定使用std::string
(这些答案是正确的——使用std::string
)
假设您只能使用char*
,由于某种原因不能使用std::string
,并且您正在处理以NULL结尾的字符串。这是您的实现必须做的事情的概要(请将其与简单使用std::string
)进行比较:
#包括
在添加了两个构造之后