我开始学习动态内存分配的主题。C++堆栈/堆栈。为什么只有一个新操作员?
我有以下代码:
#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:18 18 A classAStack; Breakpoint 4, B::B (this=0x23aa58) at ../src/B.cpp:12 12 std::cout <<"Constructor B called" << std::endl; Breakpoint 5, A::A (this=0x23aa50) at ../src/A.cpp:13 13 std::cout <<"Constructor A called" << std::endl; Breakpoint 4, B::B (this=0x23aa40) at ../src/B.cpp:12 12 std::cout <<"Constructor B called" << std::endl; Breakpoint 4, B::B (this=0x60004b048) at ../src/B.cpp:12 12 std::cout <<"Constructor B called" << std::endl; Breakpoint 5, A::A (this=0x60004b040) at ../src/A.cpp:13 13 std::cout <<"Constructor A called" << std::endl; Breakpoint 1, main() at ../src/HeapStackTest02.cpp:30 30 return 0;
我的问题:
在哪里成员变量A
类的b
?
如果我看看0x23a部分的地址,它似乎是堆栈,而0x6000部分似乎是堆。
我正在使用Windows 64位系统。
为什么成员变量b
也在堆上,没有调用new
运算符?
'A :: b'是'A'的成员,所以它的存储位于'A'的存储区内。如果'A'在堆上,那么它的所有成员都必然在堆上。 –