关于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时,指针的地址也没发生变化,我的理解是指针从哪里产生的,就应该从哪里释放,这种情况该怎么解决呢?

阅读 2.8k
2 个回答
const char* str = "abcd";

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

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

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

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

只有 new 生成的指针才可以 delete
只有 new[] 生成的指针才可以 delete[]
只有 malloc / calloc / realloc ... 等系列函数生成的指针才可以 free

内存的开辟与释放必须匹配。

你程序里的 str 不是由 new 生成的,所以不能 delete 。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题