我来自Java背景,已经开始使用C++中的对象。但我想到的一件事是,人们经常使用指向对象的指针,而不是对象本身,例如这样的声明:
Object *myObject = new Object;
而不是:
Object myObject;
或者不用函数,让我们说testFunc(),如下所示:
myObject.testFunc();
我们必须写下:
myObject->testFunc();
但我不明白我们为什么要这样做。我认为这与效率和速度有关,因为我们可以直接访问内存地址。我说得对吗?
但我不明白为什么我们要这样使用它?
如果您使用:
Object myObject;
在函数内部,此函数返回后,myObject将被销毁。因此,如果您不需要函数外的对象,这很有用。此对象将放在当前线程堆栈上。
如果在函数体内部写入:
Object *myObject = new Object;
那么,一旦函数结束,myObject指向的Object类实例将不会被销毁,并且分配在堆上。
现在,如果您是Java程序员,那么第二个示例更接近于对象分配在Java下的工作方式。此行:Object*myObject=new Object;等效于java:Object myObject=new Object();。不同的是,在javamyObject下,它将被垃圾收集,而在c++下,它不会被释放,您必须在某处显式调用“delete myObject;”否则会导致内存泄漏。
自从c++11以来,您可以通过在shared_ptr/unique_ptr中存储值来使用安全的动态分配方式:新对象。
std::shared_ptr<std::string> safe_str = make_shared<std::string>("make_shared");
// since c++14
std::unique_ptr<std::string> safe_str = make_unique<std::string>("make_shared");
此外,对象通常存储在容器中,如map-s或vector-s,它们将自动管理对象的生命周期。