c ++编译器将这种形式的"new"视为堆栈内存吗?

-3 c++ memory dynamic

可能重复:
为什么使用'new'导致内存泄漏?

我遇到过像这样的小问题

int main() {
    int i = *new int;
    delete &i;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它编译好,但在执行时,shell提供以下内容:

a.out(38303) malloc: *** error for object 0x7fff5fbff8cc: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap

int main() {
    int *i = new int;
    delete i;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

按预期正常运行.

困扰我的是,第一种情况不是使用"new"运算符来分配内存吗?为什么删除它会导致错误?

我在网上搜索了好几次,但我找不到合适的解释.谁能告诉我为什么这是错的?谢谢 :)

Jos*_*eld 11

问题是您有内存泄漏,并且您正在删除未动态分配的内容.为什么?因为您动态分配,int然后将其值复制i.然后,您尝试i通过指向它的指针删除该对象,但是i没有动态分配 - 它的值刚刚从某个东西初始化.您丢失了指向实际动态分配的对象的指针.

首先,您要new int创建一个int具有动态存储持续时间的对象并返回指向该int的指针:

        _____        ______
Heap:  | int | <--- | int* |
       |_____|      |______|
Run Code Online (Sandbox Code Playgroud)

然后取消引用指针,为您提供int对象并将其值复制到int具有自动存储持续时间的对象.在此之后,你得到的指针new会丢失,因为你没有把它存储在任何地方.

        _____
Heap:  | int |
       |_____|
        _____
Stack: | int |
       |_____|
Run Code Online (Sandbox Code Playgroud)

然后,您将获取int具有自动存储持续时间的地址并尝试使用delete它.

        _____
Heap:  | int |
       |_____|
        _____        ______
Stack: | int | <--- | int* | <-- Cannot delete because it was
       |_____|      |______|     not dynamically allocated
Run Code Online (Sandbox Code Playgroud)


fre*_*low 10

你可能想写的是:

int main() {
    int& i = *new int;   // note the reference type
    delete &i;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但请注意,如果他看到那些代码,他们心智正常的人就不会雇用你.