驗證線程棧在堆區還是棧區?

看了這篇文章 Linux中的進程棧和線程棧 說主線程生成的子線程的 stack 區是用 mmap 系統調用映射到進程的堆區。於是實踐驗證一下,代碼如下。

void* threadFunction(void* args) {
    int a = 10;
    // 線程的局部變量
    cout <<"&a : " << (&a) << endl; // 0x7f07356ace44
    getchar();
    return nullptr;
}
int main() {
    int b = 10;
    int *p = new int(10);
    // 主線程的局部變量,應該在棧區
    cout <<"&b : " << (&b) << endl; // 0x7fff99371a24
    // new的變量,應該在堆區
    cout <<"p : " << (p) << endl;  // 0x5602b1012eb0

    pthread_t thread;
    if(pthread_create(&thread, nullptr, threadFunction, nullptr) != 0) {
        std::cerr << "Failed to create thread" << std::endl;
        return 1;
    }

    pthread_join(thread, nullptr);
    return 0;
}

有了各個變量的地址,需要查看進程的地址段信息,參考 如何判斷一個內存地址屬於進程的哪一段? ,在 linux 下用 pmap 進程號查看。

[ anon ]標記就是 mmap 分配的匿名內存塊。what-does-anon-means-in-pmap-linux-cmd

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章