关于C++类中,把指针当参数传递后释放崩溃的问题?

作者站长头像
站长
· 阅读数 3

一直写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个回答
avatar
test
2024-07-08
const char* str = "abcd";

这是常量,无法被释放,类似于 const char str[] = "abcd"

常量被存放在常量存储区,在编译时就已经确定好了,无法被修改。

即使你没有 delete 动作,执行了 str = nullptr"abcd" 这段空间也不会被释放,在程序运行期间会永远存放在常量区。

只有 malloccallocreallocnew 这种方式申请的空间,才能够被释放。

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容