此代码是否存在潜在的内存泄漏问题?
CREATE TRIGGER tr_SAG_Accrual
ON [dbo].[SAG]
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
UPDATE S
SET S.OriginalNonAccrualDate = i.NONACCRUAL_DATE
FROM [dbo].[SAG] S INNER JOIN inserted i
ON s.Pk_Column = i.Pk_Column --<-- Whatever your Primary key columns is
WHERE i.OriginalNonAccrualDate IS NULL
END
如果我使用返回数字的函数(例如#include <iostream>
#include <vector>
using namespace std;
vector<int> foo()
{
vector<int> vec2;
vec2.push_back(0);
return vec2;
}
int main()
{
vector<int> vec1;
while(true)
{
vec1 = foo();
}
return 0;
}
),则没有问题,因为我们从内存堆栈复制值。但是如果我使用int
(并且我认为编译器不复制数组,向量和其他大型数据结构 - 它隐含地使用指针),情况会发生变化。
在pointer
中,我为向量分配内存并创建指向它的指针foo
。然后,我创建指向此内存扇区vec2
的第二个指针,并立即删除指针vec1
,因为函数vec2
已结束。
在foo
的第二次迭代中,我在while
中分配了一个新的内存扇区,并将指针foo
更改为该区域。
那么,第一次分配部门发生了什么?我没有任何一步免费。但是当我观察过程使用的记忆时,我看不到任何泄漏。
答案 0 :(得分:4)
没有内存泄漏,因为:
std::vector<T>
具有值类型语义:
破坏容器。调用元素的析构函数并释放已使用的存储。注意,如果元素是指针,则不会销毁指向的对象。
std::vector<T>
与值类型(在所描述的情况下为int
)一起用作类型参数。
所有使用过的std::vector<T>
个实例(变量)自动。
在C ++中,当执行到达声明位置时,将调用自动变量的构造函数。析构函数在到达给定程序块的末尾时被调用(程序块被大括号括起来)。此功能通常用于管理资源分配和解除分配,例如打开然后自动关闭文件或释放内存。见RAII。
回到问题:
在foo中,我为vector分配内存并创建指向它的指针(vec2)。然后,我创建指向此内存扇区(vec1)的第二个指针,并立即删除指针vec2,因为函数foo已结束。在第二次迭代中,我在foo中分配新的内存扇区并将指针vec1更改为该区域。
那么,第一次分配部门发生了什么?我没有任何步骤免费。
首先,发布的源代码中没有指针。 “低级”内存管理封装在std::vector<T>
中。请参阅参考资料以查找详细信息:
vector( const vector& other ); (5)
(std::vector::vector, C++ reference)。vector& operator=( const vector& other ); (1)
(std::vector::operator=, C++ reference)。