0Pricing
C++ Academy · 课时

栈分配

了解自动存储的工作方式

栈分配 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。

自动存储

局部变量存储在自动存储区中,通常称为栈。它们会在执行进入其 scope 时创建,并在执行离开时销毁。

#include <iostream>

int main() {
    int x = 42;          // on the stack
    double pi = 3.14;    // on the stack
    std::cout << x << " " << pi << "\n";
}

栈会增长和缩小

每次函数调用都会压入一个栈帧,其中保存该函数的局部变量。函数返回时,栈帧会弹出,局部变量也随之消失——不需要手动清理。

#include <iostream>

void greet() {
    int local = 7;          // pushed on call
    std::cout << local << "\n";
}                            // popped on return

int main() { greet(); }

LIFO 顺序

栈遵循后进先出。最近创建的局部变量会在 scope 结束时最先销毁。

#include <iostream>

int main() {
    int a = 1;
    {
        int b = 2;   // created after a
        std::cout << b << "\n";
    }                // b destroyed first
    std::cout << a << "\n";
}

快速且低成本

栈分配非常快:它只需移动栈指针。不需要搜索空闲内存,也不需要像堆那样进行簿记管理。

scope 决定 lifetime

栈对象只在声明它的代码块中有效。嵌套代码块拥有各自的 scope。

#include <iostream>

int main() {
    for (int i = 0; i < 3; ++i) {
        int square = i * i;   // recreated each iteration
        std::cout << square << "\n";
    }
}

大小有限

栈具有固定且有限的大小(通常只有几兆字节)。在栈上分配超大数组可能导致栈溢出崩溃。

// Risky: a large fixed array on the stack
int big[1000000];   // may overflow the stack

返回栈地址是错误

绝不要返回指向局部变量的指针或引用。函数返回后,该存储空间已经消失,指针也就悬空了。

int* bad() {
    int local = 5;
    return &local;   // BUG: local dies here
}

通过引用传递大型对象

将大型对象复制到栈上会浪费资源。通过 const& 传递对象可以避免复制,同时减少栈的使用量。

#include <string>

void print(const std::string& s) {  // no copy
    // use s
}

栈对象无需 delete

由于编译器会自动管理它们的生命周期,您绝不能对栈变量调用 delete。

#include <iostream>

int main() {
    int n = 10;
    // delete &n;   // ERROR: not heap-allocated
    std::cout << n << "\n";
}

栈上的数组

长度已知的固定大小数组位于栈上,并会在作用域结束时自动释放。

#include <iostream>

int main() {
    int values[3] = {10, 20, 30};
    for (int v : values) std::cout << v << "\n";
}

何时优先使用栈

对于大小在编译时已知且生命周期较短的小型对象,应优先使用栈。栈速度更快且会自动清理——只有在确实需要时才使用堆。

快速检查

测试您对栈分配的理解。

回顾

您已经了解到,栈分配使用与作用域绑定的自动存储:变量在进入作用域时创建,在退出作用域时按 LIFO 顺序销毁。它速度快、会自动清理,但大小有限。绝不要返回局部变量的地址,也绝不要对栈对象使用 delete。

常见问题解答

「栈分配」课时是免费的吗?

是的 — 「栈分配」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。

「栈分配」这节课中我会学到什么?

了解自动存储的工作方式 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C++ Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「栈分配」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C++ Academy 课中编写并运行代码吗?

能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 栈分配
  2. 使用 new/delete 进行堆分配
  3. 对象生命周期
  4. 常见内存错误
← 返回 C++ Academy