通过new创建的结构体字段存储在堆上还是栈上?

3

我看过关于栈和堆的介绍,但是对此并不了解。

x变量存储在哪里(堆还是栈)?我的代码是否存在内存泄露问题?

struct st
{
    int x;
    int* y;
};

st* stp;

void func()
{
    st* s=new st();

    s->x=2;
    s->y=new int(5);

    stp=s;
}

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{

    func();

    cout << stp->x << "  " << *stp->y <<endl;

    delete stp->y;
    delete stp;
}

输出 2 5

3个回答

4

stp是动态分配的,因此位于堆上。* 因此,它的所有成员(包括x)都位于堆上。

就我所见,您没有内存泄漏。


* 从技术上讲,C++标准不涉及堆栈和堆,因此编译器可以决定在哪里分配内存。但实际上,它将存储在类似堆的结构中。


2
如果第二个 new 或控制台输出(或在删除之前可能添加的任何其他代码)抛出异常,则会发生内存泄漏。 - Mike Seymour

0
动态分配的变量(比如你的stp)通常存储在堆中(除非你调用一个特殊的分配函数,它可以在栈上工作,比如alloca)。我没有看到内存泄漏。

0

当你使用newmalloc()时,内存通常从中分配。当你在函数内分配一个对象时,它会放在上。

因此,由于你使用了new st(),结构体中的x是在堆上分配的。 没有发现任何内存泄漏!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接