C++ 如何设计以char*指针作为类成员变量的类?

C++ 如何设计以char*指针作为类成员变量的类?,c++,memory-leaks,C++,Memory Leaks,首先我想介绍一下我的情况: 我已经编写了一些类,这些类使用char*指针作为私有类成员。而且这个项目有GUI,所以当单击按钮时,一些函数可能会执行多次。这些类是在项目中设计的单个类。但是其中一些函数可以执行多次。然后我发现我的项目存在内存泄漏 因此,我想问以下问题: 如何设计集合函数 如何设计使用char*成员变量的其他函数 如何设计类运算符=函数 例如: class A: { public : setStr(char * s){//need new or just use =?}; A

首先我想介绍一下我的情况:

我已经编写了一些类,这些类使用char*指针作为私有类成员。而且这个项目有GUI,所以当单击按钮时,一些函数可能会执行多次。这些类是在项目中设计的单个类。但是其中一些函数可以执行多次。然后我发现我的项目存在内存泄漏

因此,我想问以下问题:

  • 如何设计集合函数
  • 如何设计使用char*成员变量的其他函数
  • 如何设计类运算符=函数
  • 例如:

    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
    )进行比较:

    #包括

    在添加了两个构造之后