Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:是否为循环内声明的变量释放内存_C++_Memory_Memory Management - Fatal编程技术网

C++ C++;:是否为循环内声明的变量释放内存

C++ C++;:是否为循环内声明的变量释放内存,c++,memory,memory-management,C++,Memory,Memory Management,假设我有一个循环: for(int i = 0; i < 1000; i++) { vector<int> table(100000, 0); int result = some_function(&table); // ... } for(int i=0;i

假设我有一个循环:

for(int i = 0; i < 1000; i++)
{
    vector<int> table(100000, 0);
    int result = some_function(&table);
    // ...
}
for(int i=0;i<1000;i++)
{
向量表(100000,0);
int result=some_函数(&table);
// ...
}

前一个“表”实例的内存是否在每个循环周期中被释放?

是;
向量
在每次迭代时被销毁(并在每次迭代时创建)。

是;
向量
在每次迭代中被销毁(并在每次迭代中创建)。

是的,向量的析构函数将释放内存。

是的,向量的析构函数将释放内存。

取决于“内存释放”的含义

在每次迭代结束时,将调用向量的析构函数,因此将调用包含的每个元素的析构函数。因此,您不会出现内存泄漏(如果您担心的是内存泄漏的话)

但内存是否返回到操作系统是另一个问题;这是特定于实现的。至少涉及两个抽象级别:容器分配器和标准的
new
/
delete
实现

在每次迭代结束时,将调用向量的析构函数,因此将调用包含的每个元素的析构函数。因此,您不会出现内存泄漏(如果您担心的是内存泄漏的话)


但内存是否返回到操作系统是另一个问题;这是特定于实现的。至少涉及两个抽象级别:容器分配器和标准的
new
/
delete
实现。这样,内存只保留一次,但
向量的值为0:

size_t vector_size = 100000;
vector<int> table(vector_size);
for(int i = 0; i < 1000; ++i)
{
    memset( &table[0], 0, table.size() * sizeof(int) );
    int result = some_function(&table);
    // ...
}
size\u t vector\u size=100000;
向量表(向量大小);
对于(int i=0;i<1000;++i)
{
memset(&table[0],0,table.size()*sizeof(int));
int result=some_函数(&table);
// ...
}

我会这样做。这样,内存只保留一次,但
向量的值为0:

size_t vector_size = 100000;
vector<int> table(vector_size);
for(int i = 0; i < 1000; ++i)
{
    memset( &table[0], 0, table.size() * sizeof(int) );
    int result = some_function(&table);
    // ...
}
size\u t vector\u size=100000;
向量表(向量大小);
对于(int i=0;i<1000;++i)
{
memset(&table[0],0,table.size()*sizeof(int));
int result=some_函数(&table);
// ...
}

不需要
memset
,因为向量构造函数将值初始化其元素。@Jesse:不,它调用默认构造函数。结果未定义。还有一个原因:这样,数组在第二个循环中也是空的。
memset
是不必要的,因为向量构造函数会初始化它的元素。@Jesse:不,它调用默认构造函数。结果未定义。还有一个原因:这样,数组在第二个循环中也是空的。