【发布时间】:2011-11-28 01:24:01
【问题描述】:
可能重复:
Does this type of memory get allocated on the heap or the stack?
我有一些与记忆有关的问题,希望你们能够回答。考虑这段代码,Foo 代表一个包含大量方法和大量原始数据成员的大类:
class Foo {
public:
Foo() : // Initialize all data members ...
{ }
// Lots of methods ...
~Foo() { /*Nothing needed here ... correct?*/ }
private:
int a;
int b;
char c;
double d;
// Lots of other primitive data members (no pointers) ...
};
class Bar {
public:
void func() {
foo = new Foo();
}
// Assuming Bar::func() is always called before deletion ...
~Bar() { delete foo; }
private:
Foo* foo;
};
int main() {
Bar bar;
bar.func();
Bar* barptr;
barptr->func();
return 0;
}
我的问题是,当我调用bar.func() 时,Foo 的所有数据成员是否都分配在 stack 内存或 heap 内存上(我知道foo 会在堆上......我想!)?当我打电话给barptr->func() 时呢?例如,Foo::a 是在堆栈上还是在堆上?
此外,我是否需要明确删除Foo::~Foo() 中的任何内容? Foo只有原始的本地数据成员,没有一个函数使用new或malloc()。
如果我完全不知道我在说什么,如果有人能解释这些数据的存储位置,我将不胜感激。
【问题讨论】:
-
@sehe:我怀疑这是微软文本表示的产物。
-
另外:en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization 描述了为什么当 C++ 正确完成时析构函数通常是空的。
-
@sehe:你确定吗?我的Linux浏览器的复制粘贴操作没有出现这种现象,但在Windows上偶尔会出现。不知道为什么它没有每次都发生 - 也许有一些内部黑客来修复它。
-
@wallyk:我希望 SO 提议去聊天,我不知道该怎么做。我 90% 的时间在 Linux 上使用 Opera。它肯定会使用 CRLF 将所有 SO 文本复制到剪贴板 - 我需要在 vim 中一直使用
:%s/^M//g -
多余的空格只是一种编码风格。它不是任何东西的神器。
标签: c++ memory memory-management