释放内存引起的问题

KSVINSON 2009-12-22 09:36:01
//别人问我,我问别人。
//谁能给分析下 那里出问题了.
#include <string.h>
#include <iostream>


struct CStrData
{
int nDataLength;
int nAllocLength;
char* data()
{ return (char*)(this+1); }
};

class CStr
{
public:
CStr();
CStr( char * str);
CStr( CStr & obj );
~CStr();
private:
void AllocBuffer( int nlen ) ;
void Init();
CStrData* GetCStrData() const;
void ReleaseBuffer();
int GetReferenceCount();
int GetDataLength() const;

public:

operator char * () const { return ( char * ) m_pchData ; }
CStr& operator = ( const CStr& stringSrc );
char & operator []( const int & index );
int GetLen() const;
int GetAllocLength() const;
char * GetBuffer();
protected:
char * m_pchData;

};

bool operator == ( CStr & CStrObj1, CStr & CStrObj2 );
using namespace std;

CStr::CStr()
{
Init();
}

CStr::CStr( char * str )
{
int len = strlen( str ) + 1 ;
Init();
AllocBuffer( len );
strcpy( GetBuffer(), (char *)str);
}

CStr::CStr( CStr & obj )
{
char * ObjBuffer = obj.GetBuffer();
Init();
AllocBuffer( obj.GetLen()+1 );
strcpy( GetBuffer(),(char *)ObjBuffer);
*GetCStrData() = *obj.GetCStrData();
}

CStr::~CStr()
{
ReleaseBuffer();
}

void CStr::ReleaseBuffer()
{
int i = 0;
if( m_pchData )
{
m_pchData = ( char * )GetCStrData();
delete[] m_pchData;
}
m_pchData = NULL;
}

char * CStr::GetBuffer()
{
return m_pchData;
}

void CStr::Init()
{
m_pchData = NULL;
//ReleaseBuffer();

}

void CStr::AllocBuffer( int nLen )
{
if( nLen == 0 )
Init();
else
{
CStrData* pData;
if( nLen <= 64 )
{
pData = ( CStrData* )
new char[ sizeof(CStrData) + ( 64 )*sizeof( char )];
pData->nAllocLength = 64;
}
else if( nLen <= 128 )
{
pData = ( CStrData* )new
char[ sizeof(CStrData) + ( 128 )*sizeof( char )];
pData->nAllocLength = 128;
}
else if( nLen <= 256 )
{
pData = ( CStrData* )new
char[ sizeof(CStrData) + ( 256 )*sizeof( char )];
pData->nAllocLength = 256;
}
else if( nLen <= 512 )
{
pData = ( CStrData* )new
char[ sizeof(CStrData) + ( 512 )*sizeof( char )];
pData->nAllocLength = 512;
}
else
{
pData = ( CStrData* )new
char[ sizeof(CStrData) + ( nLen )*sizeof( char )];
pData->nAllocLength = nLen;
}
pData->data()[nLen] = '\0';
pData->nDataLength = nLen;
m_pchData = pData->data();
}
}

CStrData* CStr::GetCStrData() const
{
return ( CStrData* ) m_pchData - 1 ;
}

int CStr::GetReferenceCount()
{
return ( ( CStrData* ) m_pchData - 1 )->nDataLength;
}

int CStr::GetDataLength() const
{
return( ( CStrData* ) m_pchData - 1 )->nDataLength;
}

int CStr::GetAllocLength() const
{
return m_pchData ? ( ( CStrData* ) m_pchData - 1 )->nAllocLength : 0;
}

int CStr::GetLen() const
{
return GetDataLength()- 1;
}

char & CStr::operator [] ( const int & index )
{
return m_pchData[ index ];
}

bool operator == ( CStr & CStrObj1, CStr & CStrObj2 )
{
if( CStrObj1.GetLen() == CStrObj2.GetLen() )
{
if ( !strcmp( CStrObj1.GetBuffer(), CStrObj2.GetBuffer() ) )
return true;
else
return false;
}
else
return false;
}

CStr& CStr::operator=( const CStr& stringSrc )
{
if( GetAllocLength() != stringSrc.GetAllocLength() )
{
ReleaseBuffer();
//???????????????????????????
//改写成AllocBuffer( stringSrc.GetAllocLength() );
//或者是64的倍数就报错?????AllocBuffer( 64*n );
////???????????????????????????
AllocBuffer( 64 );
*GetCStrData() = *stringSrc.GetCStrData();
}
strcpy( GetBuffer(), stringSrc.m_pchData );
return *this;
}

void main()
{
CStr str1(" word");
CStr str3;
str3 = "hello ";
}


...全文
171 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
KSVINSON 2009-12-22
  • 打赏
  • 举报
回复
[code={0}]
struct CStrData
{
int nDataLength;
int nAllocLength;
//这是没问题的
char* data()
{ return (char*)(this+1); }
};
[/code]
KSVINSON 2009-12-22
  • 打赏
  • 举报
回复
我现在是看不下书啊...看见书就烦,坐不主,心魔...
KSVINSON 2009-12-22
  • 打赏
  • 举报
回复
[Quote]{ #7 兄弟,重修一下数组的下标值域范围的基础知识吧。}[/Quote]
谢谢,我也是这样想的,但是我想先弄明白这个问题....
taodm 2009-12-22
  • 打赏
  • 举报
回复
兄弟,重修一下数组的下标值域范围的基础知识吧。
KSVINSON 2009-12-22
  • 打赏
  • 举报
回复
没人回答??
KSVINSON 2009-12-22
  • 打赏
  • 举报
回复
[Quote]{#3你的程序注释太少了!别人要猜解你的意思。也不知道你的程序要达到什么目的!}[/Quote]
怪我,没注意到,再说也不是我的codes.功能类似CString.

//???????????????????????????
//改写成AllocBuffer( stringSrc.GetAllocLength() );
//或者是64的倍数就报错?????AllocBuffer( 64*n );
////???????????????????????????
[code=C++][BanUBB]using System;
//???????????????????????????
//改写成AllocBuffer( stringSrc.GetAllocLength() );
//或者是64的倍数就报错?????AllocBuffer( 64*n );
////???????????????????????????
AllocBuffer( stringSrc.GetAllocLength() );//他原来是这样写的(就是多浪费点内存,但不应该引起内存的问题)
AllocBuffer( stringSrc.GetLen()+1 );//被我改成这样就,然后发现64的被就出现内存释放的问题
[/BanUBB][/code]
longoal 2009-12-22
  • 打赏
  • 举报
回复
void CStr::Init()
{
m_pchData = NULL;
//ReleaseBuffer();

}

这里代码没语法问题。但是逻辑错误。程序问题就在这里。
zhglin999 2009-12-22
  • 打赏
  • 举报
回复
你的程序注释太少了!别人要猜解你的意思。也不知道你的程序要达到什么目的!
KSVINSON 2009-12-22
  • 打赏
  • 举报
回复
什么意思,
我觉得那里没什么问题,说出你是怎样认为的??
taodm 2009-12-22
  • 打赏
  • 举报
回复


pData->data()[nLen] = '\0';

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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