我知道标题听起来很熟悉,因为有很多类似的问题,但我要问问题的不同方面(我知道在堆栈上放置东西并将它们放在堆上之间的区别).
在Java中,我总是可以返回对"本地"对象的引用
public Thing calculateThing() {
    Thing thing = new Thing();
    // do calculations and modify thing
    return thing;
}
在C++中,要做类似的事情,我有2个选项
(1)每当我需要"返回"一个对象时,我都可以使用引用
void calculateThing(Thing& thing) {
    // do calculations and modify thing
}
然后像这样使用它
Thing thing;
calculateThing(thing);
(2)或者我可以返回指向动态分配对象的指针
Thing* calculateThing() {
    Thing* thing(new Thing());
    // do calculations and modify thing
    return thing;
}
然后像这样使用它
Thing* thing = calculateThing();
delete thing;
使用第一种方法我不必手动释放内存,但对我而言,它使代码难以阅读.第二种方法的问题是,我必须记住delete thing;,这看起来不太好.我不想返回复制的值,因为它效率低(我认为),所以这里提出问题
换句话说,实现如何跟踪计数?
是否存在一个类似于地图的对象,所有shared_ptr实例都可以访问它们,其键是指针的地址,值是引用的数量?如果我要实现一个shared_ptr,这是我想到的第一个想法.
在这些引用计数智能指针的情况下是否存在内存泄漏的可能性?如果是这样,我该如何避免它们?
c++ memory-leaks memory-management smart-pointers shared-ptr