一直写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时,指针的地址也没发生变化,我的理解是指针从哪里产生的,就应该从哪里释放,这种情况该怎么解决呢?
这是常量,无法被释放,类似于
const char str[] = "abcd"
常量被存放在常量存储区,在编译时就已经确定好了,无法被修改。
即使你没有
delete
动作,执行了str = nullptr
,"abcd"
这段空间也不会被释放,在程序运行期间会永远存放在常量区。只有
malloc
、calloc
、realloc
、new
这种方式申请的空间,才能够被释放。