一个概念性的有关问题。关于是释放指针指向内存的有关问题,求解
一个概念性的问题。关于是释放指针指向内存的问题,求解.
class stringok
{
private :
char * str;
int len;
}
需要定义一个重载:
stringok &stringok::perator=(const stringok &st)
{
if(this==&st)
return *this;
delete[] str; //问题是,这里为什么要释放?
len=st.len;
str=new char [len+1];
std::strcpy(str,st.str);
return *this;
}
稍后是要将一个新的字符串地址赋给str.但是为什么之前要使用delete删除str. 有必要吗???如果不删除会怎么样?
------解决方案--------------------
可以去参阅下林锐的《高质量的C++》吧
------解决方案--------------------
不释放 不就内存泄露咯 .....
用得着问?
------解决方案--------------------
这个对象只有一个指针,如果分配新内存,旧的必然要释放;
不然没有指针持有,那块内存就丢失了,没有办法释放了。
你不能吃着碗里的,看着锅里的,两个都想要。
------解决方案--------------------
如果先检查传进来的str长度比原来的str长度短,也可不delete,直接strcpy进去。
但是没必要啊。万一比原先的长,还是要delete了再new
所以只能是delete,再new
因为不delete,原先的指针指向的内存就不在你的控制下,不能释放,造成内存泄漏。
------解决方案--------------------
防止出现下面的这种情况,导致内存错误!
class stringok
{
private :
char * str;
int len;
}
需要定义一个重载:
stringok &stringok::perator=(const stringok &st)
{
if(this==&st)
return *this;
delete[] str; //问题是,这里为什么要释放?
len=st.len;
str=new char [len+1];
std::strcpy(str,st.str);
return *this;
}
稍后是要将一个新的字符串地址赋给str.但是为什么之前要使用delete删除str. 有必要吗???如果不删除会怎么样?
------解决方案--------------------
可以去参阅下林锐的《高质量的C++》吧
------解决方案--------------------
不释放 不就内存泄露咯 .....
用得着问?
------解决方案--------------------
这个对象只有一个指针,如果分配新内存,旧的必然要释放;
不然没有指针持有,那块内存就丢失了,没有办法释放了。
你不能吃着碗里的,看着锅里的,两个都想要。
------解决方案--------------------
如果先检查传进来的str长度比原来的str长度短,也可不delete,直接strcpy进去。
但是没必要啊。万一比原先的长,还是要delete了再new
所以只能是delete,再new
因为不delete,原先的指针指向的内存就不在你的控制下,不能释放,造成内存泄漏。
------解决方案--------------------
防止出现下面的这种情况,导致内存错误!
st.len > this->len