吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1195|回复: 9
收起左侧

[求助] 关于c++类成员的内存问题

[复制链接]
c19971130 发表于 2022-10-31 19:50
[C++] 纯文本查看 复制代码
class A{
private:
    char * data = "1234";
public:
    void Func(){
        char * old = data;
        data = new char[15];
        //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释放。 现在都倡导用智能指针,帮忙管理内存。
顺祝您:学习进步
阿阿阿阿勇 发表于 2022-11-1 09:18
不会,后面new出来的存放在堆里,之前赋值的"1234"在栈上,会自动回收的
~零度 发表于 2022-11-1 09:49
data = new char[15];

这里的内存不会释放,需要你自己手动释放,其他的内存会在类的对象析构时自动回收。
兔子哥哥 发表于 2022-11-1 10:29
局部指针  和 全局指针 存放位置不一样 不会泄露
xy20200214 发表于 2022-11-1 11:10
字符串字面值你说放哪
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 02:03

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表