gpt4 book ai didi

c++ - 了解 C++ 中的动态对象 ("new")

转载 作者:太空狗 更新时间:2023-10-29 23:41:15 25 4
gpt4 key购买 nike

我正在尝试更深入地了解 new 运算符。我确实理解它从堆中分配内存并返回指向内存的指针这一事实。我的问题是,一旦我得到指针并用它来存储另一个指向另一个声明变量的指针,值复制或指向的值是如何发生的?比如

我声明一个变量

int x = 4;

然后说

int* ptr = new int;
ptr = &x;

ptr 指向堆中的一 block 内存。 x 在拥有独立内存块的堆栈中定义。 ptr 和 x 的地址相同。如果我删除 ptr,x 仍然有效,因为它仍然存在于内存中。当我说 *ptr 时,我正在寻找 ptr 指向的值,在本例中为 4。我的问题是 4,它位于何处。它是否存在于两个独立的内存块中。一个用 x 表示,另一个是我刚从 new 得到的。这个过程是如何发生的? 4 如何跨两个 block 传输,或者我缺少 sthg?请帮忙。

此外,当我说 ptr = &x 时,它是按位复制。换句话说,我会永远失去刚刚通过堆访问的内存吗?

最佳答案

int* ptr = new int;
ptr = &x;

ptr points a chunk of memory from the heap

不,它没有。赋值后指向变量x的地址,有automatic storage .您丢失了最初由 ptr 指向的动态分配的 int 的句柄,因此您无法再删除它。 4 不会在任何“ block ”内存中传输。当您取消引用 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";

}

关于c++ - 了解 C++ 中的动态对象 ("new"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12448873/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com