字符串常量在内存中的存储会有内存泄露吗

时间:2022-02-22 00:15:09
最近学习到字符串常量char * str=“hello” 和字符数组char str[10]="hello";的区别,我知道字符串常量是存储在全局的存储区,并且是只读的。字符数组是局部变量存储在栈中。

然后我就想,当我定义char * str=“hello”然后再改变str(如str=“world”),这样会造成内存的泄露吗?

我对这个问题的猜测是不会造成泄露,猜测字符串常量的存储机制是:字符串常量保存在只读的全局区域,当添加一个字符串时,首先查看这个区域中有没有此字符串,如果存在就共用这个字符串(通过指针指向),如果没有就添加。并且还应该记录该字符串的引用次数,当新添加一个字符串也指向这个字符串时,它的引用次数加1,反之减去1.这样当它引用次数为0时就将它从内存中删除。这样就不会造成内存泄露了。

请问我的猜测对吗,我能怎么验证一下?谢谢

31 个解决方案

#1


引用楼主  的回复:
最近学习到字符串常量char * str=“hello” 和字符数组char str[10]="hello";的区别,我知道字符串常量是存储在全局的存储区,并且是只读的。字符数组是局部变量存储在栈中。

然后我就想,当我定义char * str=“hello”然后再 改变str(如str=“world”),这样会造成内存的泄露吗?
……

你改得了吗?至少在VC下你改不了。

#2


楼主的猜测完全错误

首先,str=“world”的结果是“将str指针指向只读区的world字符串”。这点是所有新手常犯的错误,以为字符指针等于字符串。实际上字符指针是指向字符串,它可以随时指向另一个字符串或者另一个字符或者另一块内存或者什么都不指。当然你可以设置它为一个常量指针,但这跟字符串本身没啥关系。
其次,如果你真的想修改该字符串,只读区也不是绝对只读。编译时设置某些选项就可以使得只读区能够被修改,当然不推荐这么做,即使这个修改在运行时不会造成严重后果,但这件事本身就是严重的程序设计错误。
最后,只读区的常量不需要引用计数,只读区在程序运行时是不变的,在程序退出释放所有资源时才销毁。

#3


字符串常量既然是只读的,你怎么去修改呢。
对于这句话 “char * str=“hello”然后再改变str(如str=“world”)”,你修改了指针指向的位置,跟内存泄露没关系的。指针变量str里存放的是地址,你将str指向"hello"改成指向"world",只需要把原来的"hello"的首地址,改成"world"的首地址,就可以了。就是把新的地址值覆盖原来的地址值而已。这和内存泄露没什么关系吧。

#4


字符串常量根本都改不了,所以楼主过虑了啊

#5


那不叫内存泄漏,建议找本说内存泄漏的文章看一下,看一下malloc这些函数

#6


不知是不是我没说清楚,我知道char * str=”hello“ 中str是指针,所以我才有疑问:这个指针不指向这个字符串后然而又没有删除原来的字符串,那么会不会造成内存的泄露?
引用 1 楼  的回复:
引用楼主 的回复:
最近学习到字符串常量char * str=“hello” 和字符数组char str[10]="hello";的区别,我知道字符串常量是存储在全局的存储区,并且是只读的。字符数组是局部变量存储在栈中。

然后我就想,当我定义char * str=“hello”然后再改变str(如str=“world”),这样会造成内存的泄露吗?
……

你改得了吗?至少在VC下你改……

#7


怎么改不了,我只是改了变量(字符型指针)的值。

引用楼主  的回复:
最近学习到字符串常量char * str=“hello” 和字符数组char str[10]="hello";的区别,我知道字符串常量是存储在全局的存储区,并且是只读的。字符数组是局部变量存储在栈中。

然后我就想,当我定义char * str=“hello”然后再改变str(如str=“world”),这样会造成内存的泄露吗?

我对这个问题的猜测是不会造成泄露,猜测字符串常量的存储机制……

#8


只有从堆上动态分配的内存,才需要归还的堆上。 归还不了的部分才叫泄露。 如果还有办法归还的,也不叫泄露,比如内存池。 字符串常量(比如, "abc")根本不在堆上,无所谓“泄露”

#9


没有分配内存,何谈内存泄露

#10


好像是会诶,因为没有如果str又重新指向一个字符串常量的话,原来它指向的那一块区域就没有指针指向它了,自然也就不能操作那块区域了,可能它也不会自动释放内存,此时就是内存泄露了吧。
引用 6 楼  的回复:
不知是不是我没说清楚,我知道char * str=”hello“ 中str是指针,所以我才有疑问:这个指针不指向这个字符串后然而又没有删除原来的字符串,那么会不会造成内存的泄露?
引用 1 楼  的回复:
引用楼主 的回复:
最近学习到字符串常量char * str=“hello” 和字符数组char str[10]="hello";的区别,我知道字符串常量是存储在全局的存储区,并且是只读……

#11


引用 10 楼  的回复:
好像是会诶,因为没有如果str又重新指向一个字符串常量的话,原来它指向的那一块区域就没有指针指向它了,自然也就不能操作那块区域了,可能它也不会自动释放内存,此时就是内存泄露了吧。
引用 6 楼  的回复:

不知是不是我没说清楚,我知道char * str=”hello“ 中str是指针,所以我才有疑问:这个指针不指向这个字符串后然而又没有删除原来的字符串,那么会不会造成内存的泄露?
引……


纠正一下你那所谓字符串常量引用次数的误解
全局区的变量、常量在编译时已存入文件里的,运行后也会一同读入内存
就是说全局区是程序从运行开始到结束,都一直存在的,没有所谓的“没有就添加”,“引用次数加1,反之减去1.”

#12


lz 的改法可以实现

但不会造成内存泄露

如果由此产生内存问题,是 compiler 或 operating system 的 bug

#13


引用 9 楼  的回复:
没有分配内存,何谈内存泄露
    + + 

#14


指针只是一个地址,可以随便指向任何可以指向的内存单元。

2楼说的很清楚了。

首先,str=“world”的结果是“将str指针指向只读区的world字符串”。这点是所有新手常犯的错误,以为字符指针等于字符串。实际上字符指针是指向字符串,它可以随时指向另一个字符串或者另一个字符或者另一块内存或者什么都不指。当然你可以设置它为一个常量指针,但这跟字符串本身没啥关系。
其次,如果你真的想修改该字符串,只读区也不是绝对只读。编译时设置某些选项就可以使得只读区能够被修改,当然不推荐这么做,即使这个修改在运行时不会造成严重后果,但这件事本身就是严重的程序设计错误。
最后,只读区的常量不需要引用计数,只读区在程序运行时是不变的,在程序退出释放所有资源时才销毁。

#15


《程序员的自我修养——链接、装载与库》

#16


这个真不会,字符串常量存储在静态区。

静态区在程序开始前由OS分配,在程序结束(main函数结束)时被OS回收。因此是不会造成内存泄露的。

#17


引用 6 楼  的回复:
不知是不是我没说清楚,我知道char * str=”hello“ 中str是指针,所以我才有疑问:这个指针不指向这个字符串后然而又没有删除原来的字符串,那么会不会造成内存的泄露?

你的程序里没有任何指针指向当前代码,请问你的程序代码占用的内存会不会造成内存泄露?
你申请的,必须你释放;不是你申请的,不用你操心

#18


{
 char *str = "hello";
 str = "world";
}
楼主想地还是比较多哈~! 
首先str指向字符串常量"hello"的首地址, 然后改变指向,重新指向”world“的首地址;
此时我们失去了对“hello”的控制, 此时楼主认为内存泄漏了哈~!(应该楼主是这样理解的哈~)
首先,针对内存泄漏这个问题,我们得知道什么是所谓的内存泄漏,先看一些比较简单的定义:1》(百度百科)用 动态存储分配函数动态开辟的空间 ,在使用完毕后未释放。(由程序申请的一块内存,且没有任何一个指针指向它,那么这块内存就泄漏了)。2》(wikipedia)A memory leak, in computer science (or leakage, in this context), occurs when a computer program consumes memory but is unable to release it back to the operating system.However, many people refer to any unwanted increase in memory usage as a memory leak, though this is not strictly accurate from a technical perspective.(这个就是楼主的看法)
楼主可以结合以上的特征,与问题自行比较。
1.char *str = "hello";(static storage). char *str2 = "hello"; 通过代码实现,发现str == str2的,但应该不存在楼主所说的引用次数。(操作系统分配的,程序员不能非法释放,会引发段错误)
2.char *str = "hello"; temp = str; str = "world“;通过实现,发现temp与str的地址正好隔6个字节(即“hello”的大小),此时确实在静态存储区重新分配存储区,但"hello"存储区并未被覆盖。
3.对内存的分配的角度有两种,操作系统和程序员:而程序员对内存的操作仅限于heap上(malloc() && free()),而我们所说的内存泄漏也就是这heap上的操作;具体有关内存泄漏知识可自己搜索,泄漏类型还是蛮多的。
4.楼主之前str指向“hello”而再指向“world”,对前面的指向并没有使用它 在应用中是没有意义的。~~!
5.缓存的作用还是很大的...eg.char *str = “hello"; char *temp = str;
(编程新手见解,见笑了~,大家懂这个意思就好)
推荐:《程序员的自我修养——链接、装载与库》

#19


完全可以改
char *p = "ABCD" 只是指针指向了一个字符串常量, 
修改P的值,跟"ABCD" 有毛线关系啊,
当然p[0] = 'a',这样就不对了,

话说静态存储区和内存泄露真心没有关系,
内存泄露是在堆里面开辟的空间

#20


lz既然知道是只读,我想问问只读是什么意思,你如何改?

#21


引用 11 楼 stjay 的回复:
引用 10 楼  的回复:
好像是会诶,因为没有如果str又重新指向一个字符串常量的话,原来它指向的那一块区域就没有指针指向它了,自然也就不能操作那块区域了,可能它也不会自动释放内存,此时就是内存泄露了吧。
引用 6 楼  的回复:

不知是不是我没说清楚,我知道char * str=”hello“ 中str是指针,所以我才有疑问:这个指针不指向这个字符串后然而又没有删除原来的字符串,那么……


您说的很对,但是向字符串这种处理的时候也是按全局变量处理吗?比如:char * str1=“hello”;char * str2="hello";那么str1和str2 是指向同一块内存还是不同的内存呢?(在C#中string是相同 的字符串只占用同一内存,当字符串操作改变值时比如字符串连接,会重新开辟一块内存保存新字符串,但是我不清楚原来的字符串如果没有指针引用之后系统是不是会释放,但我猜想会释放)。

#22


引用 12 楼 AnYidan 的回复:
lz 的改法可以实现

但不会造成内存泄露

如果由此产生内存问题,是 compiler 或 operating system 的 bug


对呀,我就是想知道系统会不会释放,我想了好长时间也没弄明白,不知道有没有方法可以验证,或者有什么资料可以参考?望高人指点呀

#23


引用 13 楼 Hangover4508 的回复:
引用 9 楼  的回复:
没有分配内存,何谈内存泄露    + +


虽然没有自己分配内存,但是系统还是会分配内存的,我说的泄露也是说在不用了之后系统会不会把它释放

#24


引用 21 楼 shpjsj 的回复:
您说的很对,但是向字符串这种处理的时候也是按全局变量处理吗?比如:char * str1=“hello”;char * str2="hello";那么str1和str2 是指向同一块内存还是不同的内存呢?(在C#中string是相同 的字符串只占用同一内存,当字符串操作改变值时比如字符串连接,会重新开辟一块内存保存新字符串,但是我不清楚原来的字符串如果没有指针引用之后系统是不是会释放,但我猜想会释放)。

同一块内存。
C++的语法里没有引用计数这种东西,想要的话自己实现。

#25


引用 23 楼 shpjsj 的回复:
引用 13 楼 Hangover4508 的回复:引用 9 楼  的回复:
没有分配内存,何谈内存泄露    + +

虽然没有自己分配内存,但是系统还是会分配内存的,我说的泄露也是说在不用了之后系统会不会把它释放

系统的分配内存与释放内存,不看你什么时候用什么时候不用
它允许你用的时候,用不用都随你的便,它不允许你用的时候,你想用也没办法用

#26


引用 21 楼 shpjsj 的回复:
引用 11 楼 stjay 的回复:引用 10 楼  的回复:
好像是会诶,因为没有如果str又重新指向一个字符串常量的话,原来它指向的那一块区域就没有指针指向它了,自然也就不能操作那块区域了,可能它也不会自动释放内存,此时就是内存泄露了吧。
引用 6 楼  的回复:

不知是不是我没说清楚,我知道char * str=”hello“ 中str是指针,所以我才有疑……


这取决于编译器有没有实现字符串池,如果实现了,那么str1, str2将指向同一个字符串。否则,将是两个。C++语言并没有强制规定实现字符串池。

对于VC编译器,是可以通过开关来打开关闭字符串池的:
Project settings -> Code Generation -> Enable String Pooling

#27


引用 14 楼 network__yang 的回复:
指针只是一个地址,可以随便指向任何可以指向的内存单元。

2楼说的很清楚了。

首先,str=“world”的结果是“将str指针指向只读区的world字符串”。这点是所有新手常犯的错误,以为字符指针等于字符串。实际上字符指针是指向字符串,它可以随时指向另一个字符串或者另一个字符或者另一块内存或者什么都不指。当然你可以设置它为一个常量指针,但这跟字符串本身没啥关系。
其次,如果你真的想修……


您好,首先非常感谢您的解释。其次,我还有个问题就是两个完全相同的字符串,在内存中是保存 一份还是两份呢?比如:char * str1=“hello”;char * str2="hello";那么“hello”在内存中是有几个备份? 最后,想请教一下,向这样设计到系统的问题我怎么验证或者查阅什么资料可以解决?
再次谢谢!

#28


引用 15 楼 zhao4zhong1 的回复:
《程序员的自我修养——链接、装载与库》


多谢啦

#29


引用 18 楼 Kying_sj 的回复:
{
 char *str = "hello";
 str = "world";
}
楼主想地还是比较多哈~! 
首先str指向字符串常量"hello"的首地址, 然后改变指向,重新指向”world“的首地址;
此时我们失去了对“hello”的控制, 此时楼主认为内存泄漏了哈~!(应该楼主是这样理解的哈~)
首先,针对内存泄漏这个问题,我们得知道什么是所谓的内存泄漏,先看一些比较简单的……

嗯,多谢您对概念的解释,内存泄露我应用的的确不合适。
对您说到的第二点,我的确有点不明白,但我并不赞同你的说法:比如,char * str1="hello"; char * str2="world"; str1的地址和str2的地址相差是12,cout<< &str1<<"--"<<&str2; 输出0020f858和0020f84c,但是&str2+3和&str1相等,说明str2的地址是以4字节为单位的。这些是为什么,不清楚啊

#30


引用
char * str1=“hello”;char * str2="hello";那么“hello”在内存中是有几个备份?


这个根据编译器选项而定,有一个类似“字符串合并”的选项,开启之后两个 hello 合并为一个。如果是VC的话,一般Release模式开启,Debug模式关闭。

#31


该回复于2012-12-08 10:04:48被管理员删除

#1


引用楼主  的回复:
最近学习到字符串常量char * str=“hello” 和字符数组char str[10]="hello";的区别,我知道字符串常量是存储在全局的存储区,并且是只读的。字符数组是局部变量存储在栈中。

然后我就想,当我定义char * str=“hello”然后再 改变str(如str=“world”),这样会造成内存的泄露吗?
……

你改得了吗?至少在VC下你改不了。

#2


楼主的猜测完全错误

首先,str=“world”的结果是“将str指针指向只读区的world字符串”。这点是所有新手常犯的错误,以为字符指针等于字符串。实际上字符指针是指向字符串,它可以随时指向另一个字符串或者另一个字符或者另一块内存或者什么都不指。当然你可以设置它为一个常量指针,但这跟字符串本身没啥关系。
其次,如果你真的想修改该字符串,只读区也不是绝对只读。编译时设置某些选项就可以使得只读区能够被修改,当然不推荐这么做,即使这个修改在运行时不会造成严重后果,但这件事本身就是严重的程序设计错误。
最后,只读区的常量不需要引用计数,只读区在程序运行时是不变的,在程序退出释放所有资源时才销毁。

#3


字符串常量既然是只读的,你怎么去修改呢。
对于这句话 “char * str=“hello”然后再改变str(如str=“world”)”,你修改了指针指向的位置,跟内存泄露没关系的。指针变量str里存放的是地址,你将str指向"hello"改成指向"world",只需要把原来的"hello"的首地址,改成"world"的首地址,就可以了。就是把新的地址值覆盖原来的地址值而已。这和内存泄露没什么关系吧。

#4


字符串常量根本都改不了,所以楼主过虑了啊

#5


那不叫内存泄漏,建议找本说内存泄漏的文章看一下,看一下malloc这些函数

#6


不知是不是我没说清楚,我知道char * str=”hello“ 中str是指针,所以我才有疑问:这个指针不指向这个字符串后然而又没有删除原来的字符串,那么会不会造成内存的泄露?
引用 1 楼  的回复:
引用楼主 的回复:
最近学习到字符串常量char * str=“hello” 和字符数组char str[10]="hello";的区别,我知道字符串常量是存储在全局的存储区,并且是只读的。字符数组是局部变量存储在栈中。

然后我就想,当我定义char * str=“hello”然后再改变str(如str=“world”),这样会造成内存的泄露吗?
……

你改得了吗?至少在VC下你改……

#7


怎么改不了,我只是改了变量(字符型指针)的值。

引用楼主  的回复:
最近学习到字符串常量char * str=“hello” 和字符数组char str[10]="hello";的区别,我知道字符串常量是存储在全局的存储区,并且是只读的。字符数组是局部变量存储在栈中。

然后我就想,当我定义char * str=“hello”然后再改变str(如str=“world”),这样会造成内存的泄露吗?

我对这个问题的猜测是不会造成泄露,猜测字符串常量的存储机制……

#8


只有从堆上动态分配的内存,才需要归还的堆上。 归还不了的部分才叫泄露。 如果还有办法归还的,也不叫泄露,比如内存池。 字符串常量(比如, "abc")根本不在堆上,无所谓“泄露”

#9


没有分配内存,何谈内存泄露

#10


好像是会诶,因为没有如果str又重新指向一个字符串常量的话,原来它指向的那一块区域就没有指针指向它了,自然也就不能操作那块区域了,可能它也不会自动释放内存,此时就是内存泄露了吧。
引用 6 楼  的回复:
不知是不是我没说清楚,我知道char * str=”hello“ 中str是指针,所以我才有疑问:这个指针不指向这个字符串后然而又没有删除原来的字符串,那么会不会造成内存的泄露?
引用 1 楼  的回复:
引用楼主 的回复:
最近学习到字符串常量char * str=“hello” 和字符数组char str[10]="hello";的区别,我知道字符串常量是存储在全局的存储区,并且是只读……

#11


引用 10 楼  的回复:
好像是会诶,因为没有如果str又重新指向一个字符串常量的话,原来它指向的那一块区域就没有指针指向它了,自然也就不能操作那块区域了,可能它也不会自动释放内存,此时就是内存泄露了吧。
引用 6 楼  的回复:

不知是不是我没说清楚,我知道char * str=”hello“ 中str是指针,所以我才有疑问:这个指针不指向这个字符串后然而又没有删除原来的字符串,那么会不会造成内存的泄露?
引……


纠正一下你那所谓字符串常量引用次数的误解
全局区的变量、常量在编译时已存入文件里的,运行后也会一同读入内存
就是说全局区是程序从运行开始到结束,都一直存在的,没有所谓的“没有就添加”,“引用次数加1,反之减去1.”

#12


lz 的改法可以实现

但不会造成内存泄露

如果由此产生内存问题,是 compiler 或 operating system 的 bug

#13


引用 9 楼  的回复:
没有分配内存,何谈内存泄露
    + + 

#14


指针只是一个地址,可以随便指向任何可以指向的内存单元。

2楼说的很清楚了。

首先,str=“world”的结果是“将str指针指向只读区的world字符串”。这点是所有新手常犯的错误,以为字符指针等于字符串。实际上字符指针是指向字符串,它可以随时指向另一个字符串或者另一个字符或者另一块内存或者什么都不指。当然你可以设置它为一个常量指针,但这跟字符串本身没啥关系。
其次,如果你真的想修改该字符串,只读区也不是绝对只读。编译时设置某些选项就可以使得只读区能够被修改,当然不推荐这么做,即使这个修改在运行时不会造成严重后果,但这件事本身就是严重的程序设计错误。
最后,只读区的常量不需要引用计数,只读区在程序运行时是不变的,在程序退出释放所有资源时才销毁。

#15


《程序员的自我修养——链接、装载与库》

#16


这个真不会,字符串常量存储在静态区。

静态区在程序开始前由OS分配,在程序结束(main函数结束)时被OS回收。因此是不会造成内存泄露的。

#17


引用 6 楼  的回复:
不知是不是我没说清楚,我知道char * str=”hello“ 中str是指针,所以我才有疑问:这个指针不指向这个字符串后然而又没有删除原来的字符串,那么会不会造成内存的泄露?

你的程序里没有任何指针指向当前代码,请问你的程序代码占用的内存会不会造成内存泄露?
你申请的,必须你释放;不是你申请的,不用你操心

#18


{
 char *str = "hello";
 str = "world";
}
楼主想地还是比较多哈~! 
首先str指向字符串常量"hello"的首地址, 然后改变指向,重新指向”world“的首地址;
此时我们失去了对“hello”的控制, 此时楼主认为内存泄漏了哈~!(应该楼主是这样理解的哈~)
首先,针对内存泄漏这个问题,我们得知道什么是所谓的内存泄漏,先看一些比较简单的定义:1》(百度百科)用 动态存储分配函数动态开辟的空间 ,在使用完毕后未释放。(由程序申请的一块内存,且没有任何一个指针指向它,那么这块内存就泄漏了)。2》(wikipedia)A memory leak, in computer science (or leakage, in this context), occurs when a computer program consumes memory but is unable to release it back to the operating system.However, many people refer to any unwanted increase in memory usage as a memory leak, though this is not strictly accurate from a technical perspective.(这个就是楼主的看法)
楼主可以结合以上的特征,与问题自行比较。
1.char *str = "hello";(static storage). char *str2 = "hello"; 通过代码实现,发现str == str2的,但应该不存在楼主所说的引用次数。(操作系统分配的,程序员不能非法释放,会引发段错误)
2.char *str = "hello"; temp = str; str = "world“;通过实现,发现temp与str的地址正好隔6个字节(即“hello”的大小),此时确实在静态存储区重新分配存储区,但"hello"存储区并未被覆盖。
3.对内存的分配的角度有两种,操作系统和程序员:而程序员对内存的操作仅限于heap上(malloc() && free()),而我们所说的内存泄漏也就是这heap上的操作;具体有关内存泄漏知识可自己搜索,泄漏类型还是蛮多的。
4.楼主之前str指向“hello”而再指向“world”,对前面的指向并没有使用它 在应用中是没有意义的。~~!
5.缓存的作用还是很大的...eg.char *str = “hello"; char *temp = str;
(编程新手见解,见笑了~,大家懂这个意思就好)
推荐:《程序员的自我修养——链接、装载与库》

#19


完全可以改
char *p = "ABCD" 只是指针指向了一个字符串常量, 
修改P的值,跟"ABCD" 有毛线关系啊,
当然p[0] = 'a',这样就不对了,

话说静态存储区和内存泄露真心没有关系,
内存泄露是在堆里面开辟的空间

#20


lz既然知道是只读,我想问问只读是什么意思,你如何改?

#21


引用 11 楼 stjay 的回复:
引用 10 楼  的回复:
好像是会诶,因为没有如果str又重新指向一个字符串常量的话,原来它指向的那一块区域就没有指针指向它了,自然也就不能操作那块区域了,可能它也不会自动释放内存,此时就是内存泄露了吧。
引用 6 楼  的回复:

不知是不是我没说清楚,我知道char * str=”hello“ 中str是指针,所以我才有疑问:这个指针不指向这个字符串后然而又没有删除原来的字符串,那么……


您说的很对,但是向字符串这种处理的时候也是按全局变量处理吗?比如:char * str1=“hello”;char * str2="hello";那么str1和str2 是指向同一块内存还是不同的内存呢?(在C#中string是相同 的字符串只占用同一内存,当字符串操作改变值时比如字符串连接,会重新开辟一块内存保存新字符串,但是我不清楚原来的字符串如果没有指针引用之后系统是不是会释放,但我猜想会释放)。

#22


引用 12 楼 AnYidan 的回复:
lz 的改法可以实现

但不会造成内存泄露

如果由此产生内存问题,是 compiler 或 operating system 的 bug


对呀,我就是想知道系统会不会释放,我想了好长时间也没弄明白,不知道有没有方法可以验证,或者有什么资料可以参考?望高人指点呀

#23


引用 13 楼 Hangover4508 的回复:
引用 9 楼  的回复:
没有分配内存,何谈内存泄露    + +


虽然没有自己分配内存,但是系统还是会分配内存的,我说的泄露也是说在不用了之后系统会不会把它释放

#24


引用 21 楼 shpjsj 的回复:
您说的很对,但是向字符串这种处理的时候也是按全局变量处理吗?比如:char * str1=“hello”;char * str2="hello";那么str1和str2 是指向同一块内存还是不同的内存呢?(在C#中string是相同 的字符串只占用同一内存,当字符串操作改变值时比如字符串连接,会重新开辟一块内存保存新字符串,但是我不清楚原来的字符串如果没有指针引用之后系统是不是会释放,但我猜想会释放)。

同一块内存。
C++的语法里没有引用计数这种东西,想要的话自己实现。

#25


引用 23 楼 shpjsj 的回复:
引用 13 楼 Hangover4508 的回复:引用 9 楼  的回复:
没有分配内存,何谈内存泄露    + +

虽然没有自己分配内存,但是系统还是会分配内存的,我说的泄露也是说在不用了之后系统会不会把它释放

系统的分配内存与释放内存,不看你什么时候用什么时候不用
它允许你用的时候,用不用都随你的便,它不允许你用的时候,你想用也没办法用

#26


引用 21 楼 shpjsj 的回复:
引用 11 楼 stjay 的回复:引用 10 楼  的回复:
好像是会诶,因为没有如果str又重新指向一个字符串常量的话,原来它指向的那一块区域就没有指针指向它了,自然也就不能操作那块区域了,可能它也不会自动释放内存,此时就是内存泄露了吧。
引用 6 楼  的回复:

不知是不是我没说清楚,我知道char * str=”hello“ 中str是指针,所以我才有疑……


这取决于编译器有没有实现字符串池,如果实现了,那么str1, str2将指向同一个字符串。否则,将是两个。C++语言并没有强制规定实现字符串池。

对于VC编译器,是可以通过开关来打开关闭字符串池的:
Project settings -> Code Generation -> Enable String Pooling

#27


引用 14 楼 network__yang 的回复:
指针只是一个地址,可以随便指向任何可以指向的内存单元。

2楼说的很清楚了。

首先,str=“world”的结果是“将str指针指向只读区的world字符串”。这点是所有新手常犯的错误,以为字符指针等于字符串。实际上字符指针是指向字符串,它可以随时指向另一个字符串或者另一个字符或者另一块内存或者什么都不指。当然你可以设置它为一个常量指针,但这跟字符串本身没啥关系。
其次,如果你真的想修……


您好,首先非常感谢您的解释。其次,我还有个问题就是两个完全相同的字符串,在内存中是保存 一份还是两份呢?比如:char * str1=“hello”;char * str2="hello";那么“hello”在内存中是有几个备份? 最后,想请教一下,向这样设计到系统的问题我怎么验证或者查阅什么资料可以解决?
再次谢谢!

#28


引用 15 楼 zhao4zhong1 的回复:
《程序员的自我修养——链接、装载与库》


多谢啦

#29


引用 18 楼 Kying_sj 的回复:
{
 char *str = "hello";
 str = "world";
}
楼主想地还是比较多哈~! 
首先str指向字符串常量"hello"的首地址, 然后改变指向,重新指向”world“的首地址;
此时我们失去了对“hello”的控制, 此时楼主认为内存泄漏了哈~!(应该楼主是这样理解的哈~)
首先,针对内存泄漏这个问题,我们得知道什么是所谓的内存泄漏,先看一些比较简单的……

嗯,多谢您对概念的解释,内存泄露我应用的的确不合适。
对您说到的第二点,我的确有点不明白,但我并不赞同你的说法:比如,char * str1="hello"; char * str2="world"; str1的地址和str2的地址相差是12,cout<< &str1<<"--"<<&str2; 输出0020f858和0020f84c,但是&str2+3和&str1相等,说明str2的地址是以4字节为单位的。这些是为什么,不清楚啊

#30


引用
char * str1=“hello”;char * str2="hello";那么“hello”在内存中是有几个备份?


这个根据编译器选项而定,有一个类似“字符串合并”的选项,开启之后两个 hello 合并为一个。如果是VC的话,一般Release模式开启,Debug模式关闭。

#31


该回复于2012-12-08 10:04:48被管理员删除