我開始學習動態內存分配的主題。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'在堆上,那麼它的所有成員都必然在堆上。 –