c19971130 发表于 2022-10-31 19:50

关于c++类成员的内存问题

class A{
private:
    char * data = "1234";
public:
    void Func(){
      char * old = data;
      data = new char;
      //delete
    };
};

这个old变量我没有delete, 类内成员data我重新分配了内存空间,这样会不会造成原来的data没有释放。

sam喵喵 发表于 2022-10-31 21:05

原来data在栈上,会自动回收,不会浪费

jasonliyi 发表于 2022-10-31 21:19

最后一句, 你又给data在堆上分配了,之前data在栈上。所以原来的data系统会自动回收。

cnbluefire 发表于 2022-11-1 07:36

原本的data指针本身在栈上,出作用域时会被自动释放。指向的"1234"是被编译器分配在只读区段,程序运行期间一直存在,不存在释放问题。

autumoon 发表于 2022-11-1 08:30

引用网上某回答,供参考:
不在栈和堆中,但是具体位置对于不同的编译器可能不同。
出了栈同堆以外,可能的数据段有代码段(.text),未初始化全局段(.bss),初始化全局段(.data),只读数据段(.rdata),
未初始化静态数据段(.sbss),初始化静态数据段(.sdata)。

对于不同的编译器,字符串常量可能被放在代码段(很少见)、初始化全局段、只读数据段或初始化静态数据段。

很多编译器会将字符串常量放在只读数据段(.rdata);这样,像下面的代码在运行时就会出错:
char *c="hello, world!";
*c = 'H';
也有部分编译器将字符串常量放在全局段或静态数据段(决定于编译器的行为以及字符串的大小);我使用过一种编译器,对于代码:
char *s="hi";
字符串"hi"就被放在静态数据段中,而
char *s="hello, world!";
字符串就被放在全局段中。

michaelgao 发表于 2022-11-1 08:33

1234字符串是常量,处于内存静态区;old\data指针本身是用来存放地址的,处于栈中。
data指向new出来的空间处于堆上;
char * data = "1234";
char * old = data;这两句,不会造成内存泄漏;
new出来的空间,一定要及时delete释放。 现在都倡导用智能指针,帮忙管理内存。
顺祝您:学习进步{:1_919:}

阿阿阿阿勇 发表于 2022-11-1 09:18

不会,后面new出来的存放在堆里,之前赋值的"1234"在栈上,会自动回收的

~零度 发表于 2022-11-1 09:49

data = new char;

这里的内存不会释放,需要你自己手动释放,其他的内存会在类的对象析构时自动回收。

兔子哥哥 发表于 2022-11-1 10:29

局部指针和 全局指针 存放位置不一样 不会泄露

xy20200214 发表于 2022-11-1 11:10

字符串字面值你说放哪
页: [1]
查看完整版本: 关于c++类成员的内存问题