内存泄漏功能,返回指针?

时间:2015-05-05 23:07:55

标签: c++ pointers memory-leaks

此代码是否存在潜在的内存泄漏问题?

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更改为该区域。

那么,第一次分配部门发生了什么?我没有任何一步免费。但是当我观察过程使用的记忆时,我看不到任何泄漏。

1 个答案:

答案 0 :(得分:4)

没有内存泄漏,因为:

  • std::vector<T>具有值类型语义:

      

    破坏容器。调用元素的析构函数并释放已使用的存储。注意,如果元素是指针,则不会销毁指向的对象。

         

    - std::vector::~vector, C++ reference

  • std::vector<T>与值类型(在所描述的情况下为int)一起用作类型参数。

  • 所有使用过的std::vector<T>个实例(变量)自动

      

    在C ++中,当执行到达声明位置时,将调用自动变量的构造函数。析构函数在到达给定程序块的末尾时被调用(程序块被大括号括起来)。此功能通常用于管理资源分配和解除分配,例如打开然后自动关闭文件或释放内存。见RAII。

         

    - Automatic variable: C, C++, Wikipedia

回到问题:

  

在foo中,我为vector分配内存并创建指向它的指针(vec2)。然后,我创建指向此内存扇区(vec1)的第二个指针,并立即删除指针vec2,因为函数foo已结束。在第二次迭代中,我在foo中分配新的内存扇区并将指针vec1更改为该区域。

     

那么,第一次分配部门发生了什么?我没有任何步骤免费。

首先,发布的源代码中没有指针。 “低级”内存管理封装在std::vector<T>中。请参阅参考资料以查找详细信息: