理解C++中的动态对象("new")

gan*_*ddy 2 c++ memory

我想更仔细地了解新的运营商.我确实理解它从堆中分配内存并返回指向内存的指针.我的问题是,一旦我得到指针并使用它来存储另一个指向另一个声明变量的指针,值复制或指向的值如何发生?所以举个例子

我宣布一个变量

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时,是一个按位复制.换句话说,我是否会永远丢失我刚刚通过堆访问的内存?

jua*_*nza 6

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)