请考虑以下事项:
A a;
class B; // No content for brevity
class A
{
public:
A()
{
b.SetTitle("hi");
}
private:
B b;
}
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是在b内部A声明的是在堆上还是在堆栈上声明.
如果在堆上,这是否意味着它被自动删除或者我也必须删除它?
问题:
这就是我最初的做法,但我认为我有点愚蠢,因为我不得不一直宣称所有的东西都是新的...如果上面是堆栈,我想它不是那么愚蠢吧?
A a;
class B; // No content for brevity
class A
{
public:
A()
{
this->b( new B() ); // I don't have C++ 14 :( so i can't do make_unique
b->SetTitle("hi");
}
private:
unique_ptr<B> b;
}
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud) 在学习C++(和C)时,我对堆栈分配的工作有一些特别的疑问,我无法找到解决方案:
堆栈分配是否隐式调用malloc/free函数?如果不; 它如何确保堆栈分配和堆分配之间没有冲突?
如是; C++中的堆栈分配是否也隐式调用new/delete?如是; 重载一个类的new运算符会影响它的堆栈分配吗?
它在VC++中产生了令人困惑的结果; 但由于VC++并不完全符合标准(或者我听说过),我决定在这里问一下......
这有什么区别:
somefunction() {
...
char *output;
output = (char *) malloc((len * 2) + 1);
...
}
Run Code Online (Sandbox Code Playgroud)
还有这个:
somefunction() {
...
char output[(len * 2) + 1];
...
}
Run Code Online (Sandbox Code Playgroud)
什么时候比另一个更合适?
谢谢大家的回答.这是一个总结:
更正欢迎.
这里有一些关于堆与堆栈之间差异的解释:
堆栈和堆的内容和位置是什么?
好吧,我昨天问了Stackoverflow和bufferoverflow之间的区别,几乎被投票遗忘,没有新的信息.
所以它让我思考,我决定重新解释我的问题,希望得到答复,这实际上解决了我的问题.
所以这里什么都没有.
我知道有四个内存段(如果我错了,请纠正我).代码,数据,堆栈和堆.现在AFAIK代码段存储代码,而数据段存储与程序相关的数据.让我严重困惑的是堆栈和堆的目的!
根据我的理解,当你运行一个函数时,函数的所有相关数据都存储在堆栈中,当你递归调用函数内部的函数时,函数内部...当函数在输出上等待时在上一个函数中,函数及其必要的数据不会从堆栈中弹出.所以最终会出现堆栈溢出.(如果我错了,请再次纠正我)
我也知道堆的用途.正如我在某处所读到的,它用于在程序执行时动态分配数据.但这提出了更多解决我问题的问题.我最初在代码中初始化变量时会发生什么..它们是在代码段中还是在数据段中还是在堆中?数组存储在哪里?是在我的代码执行后,我的堆中的所有内容都被删除了吗?总而言之,请以更简单的方式告诉我有关堆的问题,请参阅malloc和alloc,因为我不确定我完全理解这些术语是什么!
我希望人们在回答这些问题时不要迷失在技术性方面,并且可以让这些术语变得简单,以便外行人理解(即使所描述的概念不是非常流行),并且随着我们的进展继续教育我们技术术语.我也希望这不是一个太大的问题,因为我认真地认为他们不能单独询问!
我如何释放记忆?
说我有一个字符串
Dim TestStri As String
TestStri = "Test"
' What do i have to type up to get rid of the variable?
' I know
TestStri = Nothing
' will give it the default value, but the variable is still there.
Run Code Online (Sandbox Code Playgroud)
我可以对其他变量使用相同的方法,例如Long,int等.
在这段代码中:
const char * str = "hello world";
如果我理解正确,指针是4或8个字节,我想这将在堆栈上分配.但分配和存储"hello world"的内存在哪里?
或者究竟str指出了什么?
我尝试了解Go中并发编程的基础知识.几乎所有文章都使用术语"地址空间",例如:"所有goroutines共享相同的地址空间".这是什么意思?
我试图从wiki中理解以下主题,但它没有成功:
但是目前我很难理解,因为我在内存管理和并发编程等方面的知识非常差.有许多未知的单词,如段,页面,相对/绝对地址,VAS等.
有人可以向我解释问题的基础吗?可能有一些有用的文章,我找不到.
这个图像和其他类似的图像一直困扰着我一段时间.当我使用时malloc,这应该是动态数据堆的一部分.然而,这似乎是从堆栈的上方限制的,这看起来非常无效.程序无法预测我计划分配多少内存,那么程序如何判断堆栈的放置时间?似乎中间的所有内存都浪费了,我想知道这对于那些可能来自一个小型服务程序的程序是如何工作的,这个程序不使用任何动态内存而不是可能分配巨大的视频游戏记忆的部分.
比方说,我打开微软的油漆.如果我将高分辨率图片粘贴到其中,油漆的内存分配就会急剧增加.这个记忆取自哪里?我真正喜欢的是我上面标记的整个RAM棒的快照,以便可视化计算机的许多程序如何将计算机的内存整体划分,但我只能找到这样的图表,用于单个进程和单个部分RAM.
我想知道是否有办法以编程方式确定 C++ 中正在运行的程序的堆栈大小。如果是这样,是否还有一种方法可以以编程方式确定程序在运行时使用了多少堆内存?为了确定堆的大小,我可以通过重载new和delete运算符,但我认为这不适用于智能指针。
我试图通过以下方式实现它:
int main(){
const char STACK_BEGIN = 'A';
//a lot of code
register unsigned long int STACK_NOW asm("%esp");
long long int stack_size = (reinterpret_cast<int>(&STACK_BEGIN) - STACK_NOW);
//rest of code
}
Run Code Online (Sandbox Code Playgroud)