C++在循环中new出来的动态变量到底什么时候释放?

萌新提问...试图在for循环中用new创建动态变量,然后在循环外再delete。本来以为变量到delete为止都是可用的,但是编译的时候出错了。有点迷惑,new建立在堆上不是不受代码块的影响吗?请大佬指点,谢谢!!

#include<iostream>
using namespace std;

int main()
{
    for (int i = 0; i < 1; i++)
    {
        int* j = new int(1); //在循环中用new创建动态变量
    }
    cout << *j << endl; //编译的时候显示未定义j
    delete j; //明明是这里才delete的呀?
    return 0;
}

谢谢大佬回答!

new是建立在堆上,可是变量也是有作用域的,指针变量j的作用域在for循环里面,出了for循环,就出了它的作用域,肯定会报不存在的,即使没有cout << *j << endl; 这一行,delete j这一行也是会报不存在的。j不管是赋值,操作还是删除必须在它的作用域,也就是for循环里面。

你这么写会造成i-1个指针内存泄漏,也就是delete只能删除最后一次申请的,前面的都泄漏了。
应该用数组和delete [],或者每次循环内释放一次。

循环体有问题,i<i直接跳出循环没有分配内存。
不手动释放的话,直到程序结束才会释放。

这问题没那么复杂。c++中的临时变量生存空间只在两个大括号之间。你的j出了for循环的大括号就死了。
另外。动态指针要在变量死之前把申请的空间释放了。