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:不,它调用默认构造函数。结果未定义。还有一个原因:这样,数组在第二个循环中也是空的。