这是一种伪代码,但它应该清楚我想知道的内容.我看到不同代码中的所有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)
C++在类中声明char数组的正确方法是什么?
都不是.
在C++中,正确的方法是使用:
std::string buffer;
Run Code Online (Sandbox Code Playgroud)
这正是C++提供的原因std::string.它让你自由:
#1.请注意,您显示的3个示例并不等效.
#1字符缓冲区,以你的对象实例的生命周期绑定,
虽然#3没有这样做.
请注意,如果您需要一个本地缓冲区(其大小是固定的)只是为了传递给c风格的api,那么这种用法并没有很好地利用所提供的好东西,std::string并且可能静态分配的字符数组更合适.
如果您的要求是#1,#2那么更好的选择是当然std::string.