关于C++类中,把指针当参数传递后释放崩溃的问题?
一直写java,最近有时间学学C++,类型定义、类定义、指针的概念学着还行,但是把类和指针结合到一直,在测试时就有问题了,我直接上代码:
//类的定义
class Person
{
private:
const char *str = nullptr;
public:
Person(const char *str);
~Person();
};
//类的实现
Person::Person(const char *str) {
//由外部传入一个char指针,赋值给类内部的指针
this->str = str;
printf("%s\n", str);
}
Person::~Person() {
//在调用析构函数时输出一次
printf("释放前%s\n", str);
}
int main() {
const char* str = "abcd";
Person *p = new Person(str);
//释放Person对象,没问题
delete p;
p = nullptr;
//释放str,程序直接崩溃
delete str;
str = nullptr;
printf("释放后%s\n", str);
return 0;
}
就崩溃这个问题一个没想明白,而且也尝试调换释放的顺序,先释放char指针,再释放Person对象,但是还是会崩溃,debug时,指针的地址也没发生变化,我的理解是指针从哪里产生的,就应该从哪里释放,这种情况该怎么解决呢?
回复
1个回答
test
2024-07-08
const char* str = "abcd";
这是常量,无法被释放,类似于 const char str[] = "abcd"
常量被存放在常量存储区,在编译时就已经确定好了,无法被修改。
即使你没有 delete
动作,执行了 str = nullptr
,"abcd"
这段空间也不会被释放,在程序运行期间会永远存放在常量区。
只有 malloc
、calloc
、realloc
、new
这种方式申请的空间,才能够被释放。
回复
适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容