unity内存管理机制下会造成内存泄漏的一点
来源:互联网 发布:百度云 阿里云 编辑:程序博客网 时间:2024/06/09 20:54
这是最近做项目时发现的一个内存管理机制上的一个缺陷,但是我并不知道这究竟是不是一个bug,因为他可以造成内存泄漏,但是却能避开野指针,容我细细道来吧。(完整demo演示地址:http://www.demodashi.com/demo/11529.html)
第一步,我先创建一个类TestObj,类TestObj在生成时会申请一大块内存,并且类TestObj中有一个公开方法dddd(原谅我的随便)如下:
using UnityEngine;using System.Collections;public class TestObj : MonoBehaviour { public Texture2D tx2d = null; public int xxx = 112; public dui aa;// Use this for initializationvoid Awake () { tx2d = new Texture2D(2048, 1536, TextureFormat.ARGB32, false, true); aa = new dui();}// Update is called once per framevoid Update () {} public void dddd() { }}
第二步,我们需要一个生成TestObj的测试类,这个测试类如下:
using UnityEngine;using System.Collections;using System.Collections.Generic;using UnityEngine.UI;using UnityEngine.SceneManagement;public class MemeryTesr : MonoBehaviour { List<GameObject> m_objList = new List<GameObject>(); static List<UnityEngine.Events.UnityAction> m_texList = new List<UnityEngine.Events.UnityAction>();// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {} public void CreateObj() { GameObject obj = new GameObject("new obj"); TestObj t2d = obj.AddComponent<TestObj>(); m_objList.Add(obj); m_texList.Add(t2d.dddd); } public void DestroyObj() { if (m_objList.Count > 0) { Destroy(m_objList[m_objList.Count - 1]); m_objList.RemoveAt(m_objList.Count - 1); } Resources.UnloadUnusedAssets(); } public void jumpScene() { SceneManager.LoadScene("load"); }}
我们先生成一大堆对象,如下图:
将对象都删除,并且跳转场景:
我们会发现,虽然我们已经Destroy了全部的TestObj附着的GameObject,但是内存中却还会一直驻留着大量没有清理的内存。
其实原因在于我每次新创建的TestObj都把其中的方法dddd放进了static List<UnityEngine.Events.UnityAction> m_texList = new List<UnityEngine.Events.UnityAction>();
而这个是一个静态成员,会一直存在于游戏的整个过程,只要它没有被销毁,则TestObj都会存在于内存中,这虽然能解决新手程序员常写出来的野指针问题,但是却实在是造成内存泄漏。
阅读全文
0 0
- unity内存管理机制下会造成内存泄漏的一点
- 会造成内存泄漏的操作
- 哪些常见操作会造成内存泄漏?
- 哪些操作会造成内存泄漏
- IBOutlet造成的内存泄漏
- cdbexception造成的内存泄漏
- MVP造成的内存泄漏
- Android下会造成内存溢出的情况以及解决方法
- ios-IBOutlet造成的内存泄漏
- java PreparedStatement造成内存泄漏 的解决方法
- 单例造成的内存泄漏
- 匿名内部类造成的内存泄漏
- 关于造成内存泄漏的一些原因
- inputMethodManager造成的内存泄漏问题
- C++造成内存泄漏的原因汇总:
- 自动内存管理机制、java内存泄漏的定位与分析
- new 了以后,不delete ,真的会造成内存泄漏吗?
- 多线程,为每个线程维护变量副本的ThreadLocal,ThreadLocal会造成内存泄漏吗?
- 课本第三章java编程题
- AWS核心服务概览
- 生成对抗网络(GAN)相比传统训练方法有什么优势?(一)
- 知道这20个正则表达式,能让你少写1,000行代码
- luogu P1983 车站分级
- unity内存管理机制下会造成内存泄漏的一点
- 测试springmvc能否同时将参数封装到两个实体中
- 617. Merge Two Binary Trees
- Codeforces Round #431 (Div. 2) 849A Odds and Ends(思维)
- 【poj 1852】Ants
- IntelliJ IDEA 快捷键与注册码
- MyBatis的criteria的or(或查询)语法
- Python 文件操作之Copy
- 树形结构数据存储方案(二)