C++在类中声明char数组的正确方法是什么?

1 c++ arrays class char

这是一种伪代码,但它应该清楚我想知道的内容.我看到不同代码中的所有3个变体.

我的问题是,这是正确的方法,为什么?(另请参阅代码段中的注释)

test.h第一种方式:

class Test {
    public:
        Test() 
            :_buffer(NULL)
         {
            _buffer = new char[1024];
        }

        ~Test() {
           delete _buffer;
        }

        int Function() {
           //use some function like inet_ntop doesn't work _buffer is not filled
           inet_ntop(p->ai_family, addr, _buffer,  sizeof(_buffer)-1);
           //here sizeof(_buffer) returns 4, WHY ?
           cout << sizeof(_buffer) << endl;
        }

    private:
        char *_buffer;
};
Run Code Online (Sandbox Code Playgroud)

test.h第二种方式:

class Test {
    public:
        Test() {
            //_buffer is never initialized WHY ?
        }
        ~Test() {
           //_buffer is never deleted WHY ?
        }
        int Function() {
           //use some function like inet_ntop works correctly here _buffer is filled 
           inet_ntop(p->ai_family, addr, _buffer,  sizeof(_buffer)-1);
           //here sizeof(_buffer) returns 1024, WHY ?
           cout << sizeof(_buffer) << endl;
        }
     private:
         char _buffer[1024];
};
Run Code Online (Sandbox Code Playgroud)

test.h第三种方式:

class Test {
    public:
        Test() {
        }
        ~Test() {
        }
        int Function() {
           char buffer[1024];
           //use some function like inet_ntop works correctly here _buffer is filled
           inet_ntop(p->ai_family, addr, _buffer,  sizeof(_buffer)-1);
           //here sizeof(_buffer) returns 1024
           cout << sizeof(_buffer) << endl;
        }
     private:
};
Run Code Online (Sandbox Code Playgroud)

Alo*_*ave 6

C++在类中声明char数组的正确方法是什么?

都不是.
在C++中,正确的方法是使用:

std::string buffer;
Run Code Online (Sandbox Code Playgroud)

这正是C++提供的原因std::string.它让你自由:

  • 明确地将内存管理为#1&
  • 覆盖静态分配的数组的边界,如#2.

请注意,您显示的3个示例并不等效.
#1&#2字符缓冲区,以你的对象实例的生命周期绑定,
虽然#3没有这样做.

请注意,如果您需要一个本地缓冲区(其大小是固定的)只是为了传递给c风格的api,那么这种用法并没有很好地利用所提供的好东西,std::string并且可能静态分配的字符数组更合适.

如果您的要求是#1,#2那么更好的选择是当然std::string.

  • @Troy:如果你考虑例子3,Q的上下文会发生很大变化.最初的Q是,在课堂上使用字符数组的最佳方法是什么.答案是,最好的方法是使用`std :: string`.示例3只显示用户根本不需要成员.他需要的是要传递给C-api的本地字符缓冲区.并且它的使用时间不够长,不能要求`std :: string`提供的好东西.在这种情况下,单纯的字符缓冲区将更好地服务.这里要注意的重要事项是根据使用情况大幅改变上下文. (2认同)