这段代码为什么有资源泄漏!!!

ccnuxjg 2002-07-01 02:38:32
一下代码CodeGard报告有资源泄漏,不解!
ifstream in("C:\\123923.txt");
AnsiString s;
string line;

while( getline(in, line) )
{
char *p = new char[line.size()];
for( int i=0; i<line.size(); i++ )
{
p[i] = line[i];
}
AnsiString temp(p);
delete []p;
s += temp + "\r\n";
}
line.clear();
Memo1->Text = s;


...全文
96 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccnuxjg 2002-07-02
  • 打赏
  • 举报
回复
to cker(〖烟波浩淼三千里、人鬼殊途五百年〗) :
我也这么想,我认为自己的代码没有问题,可是编译器却老是报资源泄漏。

我用的BCB5,以前用VC的,现在要用它做项目,没办法了。
JamesJiang 2002-07-02
  • 打赏
  • 举报
回复
同意cker,但是怀疑标准库的实现之前,这个getline更值得怀疑.....:)所以你是不是应该将line.clear()放在while中?
ccnuxjg 2002-07-02
  • 打赏
  • 举报
回复
继续寻求高见,UP
RedGuest 2002-07-01
  • 打赏
  • 举报
回复
把AnsiString *temp;放到循环的外面

在循环的内面
temp = new AnsiString(p);
....
delete temp

///////////////////////////////
没有环境,没有试过
  • 打赏
  • 举报
回复
从你的出错信息来自于rogue wave实现的STL。
>>应该是使用BCB5吧,CB6已经放弃了RW的实现,使用了STLPort的stl实现。
这段代码中只有ifstream和标准库直接有关....
还有getline操纵了ifstream
是不是RW的bug也未可知....
不过Create_classic_facet是rw关于locale的内部实现。P.J. Plauger曾经指出这个实现并不标准...

但是怀疑标准库的实现之前,这个getline更值得怀疑.....:)
ccnuxjg 2002-07-01
  • 打赏
  • 举报
回复
to cheese(踏雪无痕) :
按你说的改了,还是一样报出资源泄漏。

char *p = new char[line.size()+1];
只是空间大小的问题
cheese 2002-07-01
  • 打赏
  • 举报
回复
开辟的p的数据区不够,这样就没有字符串结束符的位置,于是AsiString转换时不知字符串多么长,所以内存泄漏。
改为:
// char *p = new char[line.size()];
char *p = new char[line.size()+1];
p[line.size()] = '\0';
....
就没问题了。
ccnuxjg 2002-07-01
  • 打赏
  • 举报
回复
plainsong(伤心的风)
什么意思?

用getline(in, string(line.c_str())
错误
[C++ Error] Unit1.cpp(46): E2285 Could not find a match for 'getline<charT,traits,Allocator>(ifstream,string)'
短歌如风 2002-07-01
  • 打赏
  • 举报
回复
getline函数是怎么写的?

为什么要使用变量p?写成AnsiString(line.c_str())不行吗?
◥███◣ ◢███◤
◥◣P◥◣ ◢◤G◢◤
  ◥◣L◥◣ ◢◤N◢◤
  ◥◣A◥◣ ◢◤O◢◤
◥◣I◥█◤S◢◤
◥◣ N ◢◤
◥███◤

ccnuxjg 2002-07-01
  • 打赏
  • 举报
回复
我是专门写的一个程序来测试的,也有资源泄漏。我用的XP

#include <vcl.h>
#pragma hdrstop
#include <stdio.h>
#include "Unit1.h"
#include <iostream>
#include <fstream>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

using namespace std;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
ifstream in("C:\\123923.txt");
AnsiString s;
string line;

while( getline(in, line) )
{
char *p = new char[line.size()];
for( int i=0; i<line.size(); i++ )
{
p[i] = line[i];
}
AnsiString temp(p);
delete []p;
s += temp + "\r\n";
}
line.clear();
Memo1->Text = s;
}



CodeGard提示:
The Object (0XE03EFC) never delete
0X0012FA28

__rwstd::Create_classic_facet<std::ctype<char>>(std::ctype<char>*)
....



huzhangyou 2002-07-01
  • 打赏
  • 举报
回复
不清楚!
帮你up
耙子 2002-07-01
  • 打赏
  • 举报
回复
没发现呀!
警告原文怎么说的?
耙子 2002-07-01
  • 打赏
  • 举报
回复
没发现呀!
警告原文怎么说的?

13,870

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧