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之间的差异。