gpt4 book ai didi

c++ - 为什么我的对象在不使用 `new` 的情况下似乎在堆上?

转载 作者:搜寻专家 更新时间:2023-10-31 00:55:00 25 4
gpt4 key购买 nike

我开始学习动态内存分配的主题。

我有以下代码:

#include <iostream>
#include "A.h"
#include "B.h"

using namespace std;

int main() {

/* Both objects on Stack */

A classAStack;
B classBStack;

/* Both objects on Heap*/
// A *classAHeap = new A();
// B *classBHeap = new B();

/* A objects on Heap B ???*/
A *classAHeap = new A();

return 0;
}

#ifndef A_H_
#define A_H_

#include <iostream>
#include "B.h"

class A {
public:
A();
virtual ~A();

public:
B b;
};

#endif /* A_H_ */

#include "A.h"

A::A() {
std::cout <<"Constructor A called" << std::endl;
}

A::~A() {
}

#ifndef B_H_  
#define B_H_

#include <iostream>

class B {
public:
B();
virtual ~B();
};

#endif /* B_H_ */

#include "B.h"

B::B() {
std::cout <<"Constructor B called" << std::endl;
}

B::~B() {
}

调试器的输出是:

Temporary breakpoint 6, main () at ../src/HeapStackTest02.cpp:1818    A classAStack;Breakpoint 4, B::B (this=0x23aa58) at ../src/B.cpp:1212    std::cout <<"Constructor B called" << std::endl;Breakpoint 5, A::A (this=0x23aa50) at ../src/A.cpp:1313    std::cout <<"Constructor A called" << std::endl;Breakpoint 4, B::B (this=0x23aa40) at ../src/B.cpp:1212    std::cout <<"Constructor B called" << std::endl;Breakpoint 4, B::B (this=0x60004b048) at ../src/B.cpp:1212    std::cout <<"Constructor B called" << std::endl;Breakpoint 5, A::A (this=0x60004b040) at ../src/A.cpp:1313    std::cout <<"Constructor A called" << std::endl;Breakpoint 1, main () at ../src/HeapStackTest02.cpp:3030    return 0;

我的问题:

A的成员变量b在哪里?

我看0x23a段的地址好像是栈,0x6000段好像是堆。

我在 Windows 64 位系统上工作。

为什么成员变量 b 也在堆上,而没有调用 new 运算符?

最佳答案

成员 b 是您动态分配的对象的一部分,因此它是该动态分配的一部分,并且位于内存中的相同位置。

如果成员不是对象的一部分,还剩下什么?你会动态分配什么?

这就是为什么当您看到 new 时应该避免使用术语“在堆上”。不仅仅是您new 的东西“在堆上”。不,new 动态分配一个对象以及该对象直接包含的所有内容。将对象声明的编写方式与它是“在堆上”还是“在堆栈上”之间的任何心理联系都注定要失败。

确定对象存储持续时间的唯一可靠方法是了解其历史;确定对象存储位置的唯一可靠方法是不要打扰,因为您不需要这样做。

关于c++ - 为什么我的对象在不使用 `new` 的情况下似乎在堆上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43413312/

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