- Invalid Conversion from ‘const char*’ to ‘char (常量无法转成普通变量)
https://blog.csdn.net/qq_57761637/article/details/140312258
const_cast<char*>(message)
,利用const_cast强转。
- c++ 函数返回局部class实例的指针为空指针
在C++中,函数可以返回指向局部类实例的指针的问题是,局部类实例随着函数的结束会被销毁,返回的指针将指向一个已经销毁的对象,这是一个常见的错误。要避免这个问题,你可以通过以下几种方式来返回局部类实例的指针:
1.使用new关键字在堆上创建类实例,然后返回指针。这样可以避免局部实例的销毁问题,但要记得最终使用完毕后需要通过delete来释放内存。
class MyClass {
public:
void Display() {
cout << "Hello, World!" << endl;
}
};
MyClass* CreateMyClass() {
MyClass* obj = new MyClass();
return obj;
}
int main() {
MyClass* obj = CreateMyClass();
obj->Display();
delete obj;
return 0;
}
2.将类实例作为函数的静态局部变量,这样它的生命周期会和程序的生命周期一样长,直到程序结束。
class MyClass {
public:
void Display() {
cout << "Hello, World!" << endl;
}
};
MyClass* GetMyClass() {
static MyClass obj;
return &obj;
}
int main() {
MyClass* obj = GetMyClass();
obj->Display();
return 0;
}
3.如果你的类有一个生命周期长于函数的外部类,你可以返回指向这个外部类中的类实例的指针。
class OuterClass {
public:
class MyClass {
public:
void Display() {
cout << "Hello, World!" << endl;
}
};
MyClass* GetMyClass() {
return &myClassInstance;
}
private:
MyClass myClassInstance;
};
int main() {
OuterClass outer;
OuterClass::MyClass* obj = outer.GetMyClass();
obj->Display();
return 0;
}
4.如果你不希望使用堆或者改变类实例的生命周期,另一个选择是使用智能指针(例如std::unique_ptr或std::shared_ptr)来管理资源。
class MyClass {
public:
void Display() {
cout << "Hello, World!" << endl;
}
};
std::unique_ptr<MyClass> CreateMyClass() {
std::unique_ptr<MyClass> obj(new MyClass());
return obj;
}
int main() {
std::unique_ptr<MyClass> obj = CreateMyClass();
obj->Display();
// 不需要手动删除,智能指针会自动释放资源
return 0;
}
以上方法都可以避免返回指向已销毁局部类实例的指针的问题,但是要注意管理好内存,避免内存泄露。
0 条评论