我想更仔细地了解新的运营商.我确实理解它从堆中分配内存并返回指向内存的指针.我的问题是,一旦我得到指针并使用它来存储另一个指向另一个声明变量的指针,值复制或指向的值如何发生?所以举个例子
我宣布一个变量
int x = 4;
Run Code Online (Sandbox Code Playgroud)
并说
int* ptr = new int;
ptr = &x;
Run Code Online (Sandbox Code Playgroud)
ptr从堆中指出一块内存.x在具有单独的一块内存的堆栈中定义.ptr和x的地址是相同的.如果我删除ptr,x仍然有效,因为它仍然存在于内存中.当我说*ptr时,我正在寻找ptr指向的值,在这种情况下是4.我的问题是4,它在哪里.它是否存在于两个独立的内存块中.一个是x和其他我用新的代表.这个过程是如何发生的?4如何通过两个块传输,或者我错过了什么?请帮忙.
另外,当我说ptr =&x时,是一个按位复制.换句话说,我是否会永远丢失我刚刚通过堆访问的内存?
int* ptr = new int;
ptr = &x;
Run Code Online (Sandbox Code Playgroud)
ptr从堆中指出一块内存
不,它没有.在赋值之后,它指向变量的地址x
,该变量具有自动存储.您丢失了int
最初指向的动态分配的句柄ptr
,因此您无法再删除它.4
不会通过任何"大块"的内存传输.当您取消引用时ptr
,您将获得由x 引用的变量,该变量保存该值4
.
试试这个例子:
#include <iostream>
int main()
{
int x = 4;
int* ptr = new int;
ptr = &x; // lose handle on dynamically allocated int: MEMORY LEAK
std::cout << (*ptr) << "\n";
x += 1;
std::cout << (*ptr) << "\n";
(*ptr) += 1;
std::cout << x << "\n";
}
Run Code Online (Sandbox Code Playgroud)