C++ 编译器提供的复制选择器

C++ 编译器提供的复制选择器,c++,C++,分配给char*ptr的内存是什么: #include <iostream> using namespace std; class A { private: int count; char *ptr; public : void print() { cout << "Addr " << &ptr << endl; cout

分配给
char*ptr
的内存是什么:

#include <iostream>
using namespace std;
class A
{ 
  private:
  int count;
  char *ptr;                                 
  public :
  void print()
  {    
  cout << "Addr " << &ptr << endl;     
  cout << "Addr " << *ptr << endl;     
  }       

};

int main()
{
 A obj;
 obj.print();
 A *obj1 = new A(obj); 
 obj1->print();
 cin.get();             
 return 0;   
}
#包括
使用名称空间std;
甲级
{ 
私人:
整数计数;
char*ptr;
公众:
作废打印()
{    

cout有多少内存?好吧,一个也没有。你只有一个统一的
char*
,它本身占用
sizeof(char*)
字节的内存。你需要自己分配内存(可能有一个
新的
),并将该内存分配给
ptr
。别忘了释放内存(可能是通过
删除
)完成后;通常在析构函数中完成

更好的方法是使用
std::string
,它会为您保留所有内存


(另一方面,从技术上讲,
行不能多少内存?好吧,一个也没有。您所拥有的只是一个统一的
字符*
,它本身占用
大小(字符*)
字节的内存。您需要自己分配内存(可能需要一个
新的
)并将该内存分配给
ptr
。使用完内存后,不要忘记释放内存(可能使用
delete
),通常在析构函数中完成

更好的方法是使用
std::string
,它会为您保留所有内存


(另外,从技术上讲,
cout行
char*
在32位机器上单独占用4个字节,在64位机器上占用8个字节。当您分配内存时(可能使用
new
分配)到
ptr
只有内存地址存储在
ptr
中,实际内存分配在堆上。

char*
在32位机器上会占用4个字节,在64位机器上占用8个字节。当您分配内存时(可能使用
new
分配)到
ptr
只有内存地址存储在
ptr
中,实际内存分配在堆上。

它只是
char*
使用的内存,即
sizeof(char*)
bytes。您提供的示例将不会编译,因为
ptr
从未初始化,所以行
cout@MattClarkson在两个计数上都是错误的-它将编译,但会产生未定义的行为。@LuchianGrigore抱歉,我错了,它将编译,并且我猜它将取消引用未初始化的指针,所以是的,它可以打印nything或segfault.UB总是很有趣的。它只是
char*
使用的内存,即
sizeof(char*)
bytes。您提供的示例将不会编译,因为
ptr
从未初始化,所以行
cout@MattClarkson在两个计数上都是错误的-它将编译,但会产生未定义的行为。@LuchianGrigore抱歉,我错了,它将编译,并且我猜它将取消引用未初始化的指针,所以是的,它可以打印nything或segfault.UB总是很有趣。
obj1
不是堆栈分配的。所以它也不是
ptr
成员。@Juanchopanza:好的观点。删除了:在回答范围之外,指出obj和obj1之间的区别。
obj1
不是堆栈分配的。所以它也不是
ptr
成员。@Juanchopanza:好的观点.已删除:超出回答范围,以指出obj和obj1之间的差异。