2 ninying NinYing 于 2017.09.09 10:39 提问

静态指针动态申请内存

静态指针动态申请内存,定义指针时申请了内存,然后每次满足条件时会释放内存再重新分配内存,但是由于不知道何时会是最后一次重新分配,因此最后一次使用后没有释放内存。请问这样会造成内存泄漏吗?
代码示例如下:

 void foo(int var){
     static int var_save = var;
     static T* ptr = new T;
     if (var_save!=var){
        delete ptr;
        var_save = var;
        ptr = new T;
     }
 }
 int main ( int argc, char* argv[]){
    //......
    while(1){
        //......
        foo(var);
        //......
    }
    return 0;
 }

3个回答

qq_28249373
qq_28249373   2017.09.09 11:10
已采纳

如果内存被释放了,你再引用就会报错。如果动态的分配的内存不去人工释放,那么这个内存会在程序结束的时候被系统回收。由于动态分配的内存在堆区,所以
可用的空间很大,一般不会因为空间不够而出现内存泄漏。当然,如果你动态分配的空间很大,比如说500M,或者分配了很多动态内存,那么不手动释放的话,就有可能造成内存泄漏。你要根据动态分配的空间大小,决定是否一定要手动释放内存。

NinYing
NinYing 谢谢前辈指点!
10 个月之前 回复
qq_28249373
qq_28249373   2017.09.09 11:11

如果内存被释放了,你再引用就会报错。如果动态的分配的内存不去人工释放,那么这个内存会在程序结束的时候被系统回收。由于动态分配的内存在堆区,所以
可用的空间很大,一般不会因为空间不够而出现内存泄漏。当然,如果你动态分配的空间很大,比如说500M,或者分配了很多动态内存,那么不手动释放的话,就有可能造成内存泄漏。你要根据动态分配的空间大小,决定是否一定要手动释放内存。

what951006
what951006   Rxr 2017.09.09 11:21

假如var_save==var,你这不就内存泄漏了,给你一种不泄漏的参考,最多只有一份在堆区

void foo(int var){
static T* ptr = NULL;
if(ptr)
delete ptr;
ptr=new T;
}

NinYing
NinYing 先谢谢前辈指点!当var_save==var时,ptr没有delete也没有new呀。我希望在满足一定条件的时候(var_save==var),对T*指向的内存继续操作,并不重新分配;在不满足条件的时候,释放T*重新分配。所以您的参考不适用啊。不过还是谢谢前辈给的参考!
10 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
关于类静态成员变量指针通过动态分配的内存如何回收的探讨
一个类假如存在一个静态成员变量指针,在以下几种情况下动态分配内存,该如何回收内存: 1)在外部函数中动态分配内存,代码如下: test.cpp class Test { public: static char* m_pSZ; }; char* Test::m_pSZ = NULL; void testAlloc() { Test::m_pSZ = new char[16]
C++ 申请动态内存的三种方式
C++ 申请动态内存的三种方式 目前常用的三种申请动态内存的主要方式为以下几种 1、
指向指针的指针申请动态内存
在《高质量c编程指南》中,提到了 如果函数的参数是一个指针,那么别指望它能申请动态内存。 代码如下:#include<stdio.h> #include<stdlib.h> void GetMemory(char *p,int num);int main() { char* stu=NULL; GetMemory(stu,100); printf("%d\n",stu);
指针申请内存后到底有什么变化?
我是一名在校大学生,以下纯属个人观点,都是经过我反复思考过的东西,我感觉这些东西在我学c时带了了许多不便,学校讲的也不好,只能自学。 若您发现任何错误,请发到我邮箱1195264226@qq.com 进行纠正,非常感谢! 在讲这个问题之前要先纠正一个大多数人嘴边的错误: 为一个指针申请内存,并不是人们理解的那个‘为’指针申请空间, 而是单独申请一个空间,把这个空间的地址给指
自动释放内存的指针
利用栈变量跳出作用域的时候,会自动调用析构函数, 可以做个自动释放内存的类: template class auto_delete_ptr { public:     explicit auto_delete_ptr(_Ty *_Ptr)         : _Myptr(_Ptr)     {     }     ~auto_delete_ptr()     {  
C指针申请内存
#include struct abc{ int len; }; typedef struct abc Abc; void fun1(Abc **a,Abc *b){ free(*a); *a=b; } void fun2(Abc **a){ Abc *new =(Abc *)malloc(sizeof(Abc));
申请动态内存——malloc()函数及其扩展函数
1.malloc()概述——申请动态内存malloc(num)向系统申请num字节的动态内存,内存于“堆”里存放,若申请成功,则函数返回(无类型)数组的首地址,失败则返回NULL,并且申请之后的内存中并没有初始化。该函数需要引用头文件——stdlib.h。 由于“堆”有一个特性——由程序自行管理内存,所以在申请了动态内存之后,需要利用free()自行释放,这是为了避免出现野指针,并且把指向
简述C语言动态、静态内存分配
#include #include /** c语言静态内存分配 */ void func(int** address ) { //定义int类型的i变量,并赋值100 int i = 100; //把i对应的地址赋值给iPoint变量 *address = &i; } int main(int argc, char *argv[]) { //定义int类型的一级指针变量iPoin
走进C++程序世界-----指针(动态申请空间和释放空间)
使用关键字NEW分配内存     在讲解分配内存之前,首先来理解下内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区这些也是初学者容易混淆的地方。我的博客中有一篇文章描述C语言中代码分配情况,点击链接      下面部分是转载于:http://blog.sina.com.cn/s/blog_7edcf63b0100yhk9.html       一. 在c中分为这几个存储
动态分配内存与静态内存
1) 静态内存分配是在编译时完成的,不需要占用CPU资源;动态分配内存是在运行时完成的,动态内存的分配与释放需要占用CPU资源; 2) 静态内存分配是在栈上分配的,动态内存是堆上分配的; 3) 动态内存分配需要指针或引用数据类型的支持,而静态内存分配不需要; 4) 静态分配内存需要在编译前确定内存块的大小,而动态分配内存不需要编译前确定内存大小,根据运行时环境确定需要的内存块大小,按照