关于c++类成员的内存问题
class A{private:
char * data = "1234";
public:
void Func(){
char * old = data;
data = new char;
//delete
};
};
这个old变量我没有delete, 类内成员data我重新分配了内存空间,这样会不会造成原来的data没有释放。 原来data在栈上,会自动回收,不会浪费 最后一句, 你又给data在堆上分配了,之前data在栈上。所以原来的data系统会自动回收。 原本的data指针本身在栈上,出作用域时会被自动释放。指向的"1234"是被编译器分配在只读区段,程序运行期间一直存在,不存在释放问题。 引用网上某回答,供参考:
不在栈和堆中,但是具体位置对于不同的编译器可能不同。
出了栈同堆以外,可能的数据段有代码段(.text),未初始化全局段(.bss),初始化全局段(.data),只读数据段(.rdata),
未初始化静态数据段(.sbss),初始化静态数据段(.sdata)。
对于不同的编译器,字符串常量可能被放在代码段(很少见)、初始化全局段、只读数据段或初始化静态数据段。
很多编译器会将字符串常量放在只读数据段(.rdata);这样,像下面的代码在运行时就会出错:
char *c="hello, world!";
*c = 'H';
也有部分编译器将字符串常量放在全局段或静态数据段(决定于编译器的行为以及字符串的大小);我使用过一种编译器,对于代码:
char *s="hi";
字符串"hi"就被放在静态数据段中,而
char *s="hello, world!";
字符串就被放在全局段中。 1234字符串是常量,处于内存静态区;old\data指针本身是用来存放地址的,处于栈中。
data指向new出来的空间处于堆上;
char * data = "1234";
char * old = data;这两句,不会造成内存泄漏;
new出来的空间,一定要及时delete释放。 现在都倡导用智能指针,帮忙管理内存。
顺祝您:学习进步{:1_919:} 不会,后面new出来的存放在堆里,之前赋值的"1234"在栈上,会自动回收的 data = new char;
这里的内存不会释放,需要你自己手动释放,其他的内存会在类的对象析构时自动回收。 局部指针和 全局指针 存放位置不一样 不会泄露 字符串字面值你说放哪
页:
[1]