首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >删除列表分配的内存

删除列表分配的内存
EN

Stack Overflow用户
提问于 2012-12-11 11:31:02
回答 1查看 2.3K关注 0票数 0

看一下下面的代码。在这段代码中,在执行开始时,内存使用量是1020K。但是在执行结束时,内存使用量是1144K。谁能帮我找出内存泄露的原因。如果调用func()五次,内存使用量将分配给1500K+。如果我们不使用列表,内存使用量不会增加。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void func();

int _tmain(int argc, _TCHAR* argv[])
{
    func();
    return 0;
}

void func()
{
    list<char*> list1;
    list<char*>::iterator iter;
    char* val;
    for(int i=0; i<100000; i++)
    {
        val = new char[20];
        for(int j=0; j<20;j++)
        {
            val[j] = 'A';
        }
        val[19] = '\0';
        list1.push_back(val);
    }

    iter = list1.begin();
    for(int k=0; k<100000;k++, iter++)
    {
        delete[] *iter;
        *iter = NULL;
    }
    val = NULL;

    list1.clear();
    list1.empty();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-11 12:06:10

我在这里看不到内存泄漏,,但是我确实看到了很多非常糟糕的代码。

我在你的代码中看到了一些提示,你是在Windows下运行的,当我凝视我的水晶球时,我想我看到你在检查任务管理器来检测内存泄漏。使用任务管理器检测内存泄漏就像使用大刀做手术一样。TM也许能够给你一个提示,系统中可能存在大量的内存泄漏,但它离你的程序太远了,太粗糙了,不能确定。您需要使用专门用于该工作的工具,而不是使用TM来确定是否存在内存泄漏。Visual Studio has such a tool内置。

当我在您的代码中使用这些内置工具时:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <cstdlib>
#include <list>
using std::list;

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>


void func();

int main(int argc, char* argv[])
{
    func();
    return 0;
}

void func()
{
    list<char*> list1;
    list<char*>::iterator iter;
    char* val;
    for(int i=0; i<100000; i++)
    {
        val = new char[20];
        for(int j=0; j<20;j++)
        {
            val[j] = 'A';
        }
        val[19] = '\0';
        list1.push_back(val);
    }

    iter = list1.begin();
    for(int k=0; k<100000;k++, iter++)
    {
        delete[] *iter;
        *iter = NULL;
    }
    val = NULL;

    list1.clear();
    list1.empty();

    _CrtDumpMemoryLeaks();
}

...I请参阅:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Detected memory leaks!
Dumping objects ->
{142} normal block at 0x00000000000778C0, 24 bytes long.
 Data: < x       x      > C0 78 07 00 00 00 00 00 C0 78 07 00 00 00 00 00 
{141} normal block at 0x0000000000077840, 16 bytes long.
 Data: <(       h       > 28 F7 1A 00 00 00 00 00 68 F7 1A 00 00 00 00 00 
Object dump complete.

有两个内存泄漏报告,总共40个字节,所以这里没有广泛的内存泄漏。此外,这些可能是误报,报告CRT的静态内存分配等情况,应该忽略。

然而,正如我所说的,我确实看到了很多非常糟糕的代码。这不是造成内存泄漏的原因,但它们很容易出现在真正的代码中。

  1. You使用了大量的 。例如使用for(int i=0; i<100000; i++),你应该迭代列表(for( list<char*>::iterator it = list1.begin(); it != list1.end(); ++it)),或者至少询问列表中有多少元素正在使用动态分配/释放。在你确实需要动态分配的情况下,你应该使用RAII,但只要有可能,就应该避免动态分配。在您的例子中,您应该有一个使用手写循环的list<std::string> instead.
  2. You,在您可以使用标准库提供的算法的地方使用list<char*>,而不是list<std::string>。你从未写过的代码是最可靠的代码。使用copytransform.

代替内部循环初始化字符数组,只需执行std::string s(20,'A'),而不是外部循环设置每个列表成员

编辑以下是您的函数的重新设计版本,它解决了我上面提到的一些问题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <string>
using std::string;
#include <algorithm>
using std::generate_n;
#include <iterator>
using std::back_inserter;

void func()
{
    static const size_t NumStrings = 10000;
    typedef list<string> strings;

    // Populate the list
    strings list2;
    generate_n(back_inserter(list2), NumStrings, []() -> string
    {
        static const size_t NumChars = 19;
        static const char InitChar = 'A';
        return string(NumChars, InitChar);
    });

    // Clear the list
    list2.clear();

    // Done
    _CrtDumpMemoryLeaks();
}

generate_n的调用使用C++11 lambda,但可以很容易地重构为使用函数器或其他完全的东西。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13819451

复制
相关文章
Python 字符串 去中间空格
这招不太灵光,不仅是因为编码的问题(2.x 的版本中使用 repr()可以看到空格对应的编码,用其替换),而且太麻烦,不够灵活 。
py3study
2020/01/11
2.4K0
php用空格分隔字符串,分割字符串空格[通俗易懂]
String[] data = s.split(“@”); // 以@分割字符串,获得@后的值。
全栈程序员站长
2022/11/16
6.3K0
去掉多余的空格---输入一个字符串,字符串中可能包含多个连续的空格,请将多余的空格去掉,只留下一个空格。输入格式
输入一个字符串,字符串中可能包含多个连续的空格,请将多余的空格去掉,只留下一个空格。
莫浅子
2022/11/18
2.7K0
JS去除字符串的空格
JS去除字符串前后空格 //去前后空格 //var LO = data.replace(/(^\s*)|(\s*$)/g, ""); //var LA = data.replace(/(^\s*)|(\s*$)/g, ""); JS去除字符串所有空格 //直接去除所有的空格 var LL = data.replace(/\s+/g,""); 在Kettle做数据清洗中用到的: //Script here //去前后空格 //var LO = LONGITUDE.replace(/(^\s*)|(\s*
手撕代码八百里
2020/07/28
8K0
带空格的字符串反转
就是输入一段文本,然后让你实现字符串反转。 肺炎严重,假期延长,闲的不得不自主学习,然后就日常刷水题。 第一次的方法,简单易懂,就是时间超限了。TLIM #include<bits/stdc++.h> using namespace std; stack<string> st; int main(){ string s; cin>>s; reverse(s.begin(),s.end()); st.push(s); while(getchar() != '\n'){ cin>>s; re
杨鹏伟
2020/09/11
1.3K0
字符串:替换空格
示例 1: 输入:s = "We are happy." 输出:"We%20are%20happy."
代码随想录
2020/09/10
4.6K0
字符串:替换空格
php删除字符串的空格
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/105882.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/09
3.6K0
PHP去除多余空格 多个连续空格只保留一个
/** 多个连续空格只保留一个 * @param string $string 待转换的字符串 @return unknown */ static public function merge_spa
大师级码师
2021/10/29
2.7K0
关于字符串切割空格
注意: 不要在split方法中写" ", 这样只能匹配到一个空格 String s = "hello world you"; String[] split = s.split("\\s+"); for (String s1 : split) { System.out.println(s1); }
乐心湖
2020/07/31
1.1K0
算法-字符串替换空格
chaibubble
2018/01/02
2.4K0
算法-字符串替换空格
android空格字符串_v1d空格复制
&#160; == &nbsp; == &#xA0; == no-break space (普通的英文半角空格但不换行)
全栈程序员站长
2022/09/30
8260
python 字符串去空格
1、lstrip:删除左边的空格 这个字符串方法,会删除字符串s开始位置前的空格。
全栈程序员站长
2022/09/03
2.6K0
js去除字符串空格
去除字符串内所有的空格:str = str.replace(/\s*/g,””);
青梅煮码
2023/01/16
9.9K0
[785]python去掉字符串中多余的空格
参考:https://www.jianshu.com/p/25def1847697 https://blog.csdn.net/baidu_15113429/article/details/80651091
周小董
2020/04/21
1.5K0
javascript去掉字符串前后空格
使用场景 当我们进行一些页面编辑时,字符串前后的空格,通常是无效的。因此需要在获取信息时,进行过滤。 比如: 输入:[空格][空格]a[空格]b[空格][空格][空格] 得到:a[空格]b 代码如下: 去掉前面的空格 1 function LTrim(str){ 2 var i; 3 for(i=0;i<str.length;i++){ 4 if(str.charAt(i)!=" ") 5 break; 6 } 7
用户1154259
2018/01/17
2.2K0
JavaScript 去除字符串首尾空格
Unsplash 去除字符串首尾空格的方式,主要是利用正则进行替换,这里写了两种方式供大家参考 function trim(string) { if(string.trim) { return string.trim(); }else { let reg = /^\s+|\s+$/g; return string.replace(reg,""); } } if(typeof String.prototype.trim !== "func
Nian糕
2020/05/26
4.2K0
JavaScript 去除字符串首尾空格
Python_去除字符串中的空格
01. strip() 方法 strip() :用于移除字符串头尾指定的字符(默认为空格)或字符序列。 注: 该方法只能删除开头或结尾的字符,不能删除中间部分的字符。 old_data = " a b c d 1 1 3 1 " new_data = old_data.strip() old_data2 = "com.123fa.comsfasf.comasdfrs324.com" new_data2 = old_data2.strip(".com") print(new_data) print(new
用户7741497
2022/03/24
1.8K0
Java字符串去掉空格的几种方法
其中,\s可以匹配空格、制表符、换页符等空白字符 参考:Java正则表达式https://www.runoob.com/java/java-regular-expressions.html
kirin
2020/07/01
4.7K0
深度学习中的模型修剪
本在本文中,我们将介绍深度学习背景下的模型修剪机制。模型修剪是一种丢弃那些不代表模型性能的权重的艺术。精心修剪的网络会使其压缩版本更好,并且它们通常变得适合设备上的部署。
deephub
2020/07/06
1.1K0
深度学习中的模型修剪
利用切片操作去除字符串空格
在写一个函数,利用切片操作,可以去除一个字符串前后的空格,比如字符串' I.m working ',去除前后空格后得到‘I‘m working’
算法与编程之美
2021/11/23
1.9K0

相似问题

C#列表.ConvertAll效率和开销

45

ConvertAll (UWP C#)

13

C# ConvertAll语法

27

带索引的C#列表ConvertAll

18

IEnumerable<T>.ConvertAll和DDD

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文