【发布时间】:2022-01-23 21:38:53
【问题描述】:
我继承了一堆 C++ 代码,其中充满了 std::shared_ptrs,其中大多数 [all?] 都是不必要的,而且我怀疑它们会降低性能。一口气改完所有东西是不可行的,所以我分批改代码,做性能测试。
我遇到的一个问题是我的新“原始”指针代码和底层 shared_ptr 内容之间的方法层次结构中的接口。一个人为的例子(我知道它可以被简化......):
SomeObject *MyClass::GetSomeObject(const std::string& aString)
{
//for the underlying shared pointer methods
std::shared_ptr<std::string> tmpString = make_shared<std::string>(aString);
//call the method using my local shared pointer
std::shared_ptr<SomeObject> someObj = GetTheObject(tmpString);
//The line below gives compiler warning: "The pointer points to memory allocated on the stack"
return someObj.get(); // a pointer to an object in std::map
}
我知道GetTheObject() 正在返回一个指向持久化std::map 中的对象的指针,因此在我们退出GetSomeObject() 和共享指针[和其包装的原始指针] 已超出范围。
我没有忽视警告的习惯,所以:
问题:
-
警告是因为编译器担心共享指针的范围而不是指向的对象吗? [IE。在这种情况下我可以忽略它吗?]
-
如果这是一个真正的问题,是否有任何巧妙的方法解决这个问题(不涉及构建包装类和此类解决方法......)?
【问题讨论】:
-
someObj会尝试删除对象,这是一个真正的问题。 -
我很困惑您认为将
shared_ptr的使用更改为原始指针会带来什么性能改进。这个 sn-p 至少不会有任何收获,因为它仍然首先复制shared_ptr导致引用计数增加(并在返回时减少) -
你好@apple apple:在进一步的调查[断点,观察窗口]中,
return someObj.get();正在返回我怀疑/希望的内容:存储在持久性@中并从中检索到的对象的地址987654329@ 在GetTheObject(...)调用中访问。并且此地址已成功传递给调用方法。显然,检索到的地图对象本身并不是删除的目标。因此,除非还有其他问题需要考虑,否则“GetSomeObject(...)”会返回一个完全有效的内存地址...或者在我看来是这样??? -
您得到一个存储在
someObj中的指针,然后someObj立即超出范围。 shared_ptr 销毁时做了什么? -
你好@BoP:同样的论点适用于任何返回指针的本地定义的构造,不是吗?手头的问题是目标内存本身是否超出范围。在我的情况下,它没有。我不知道内部结构 - 但
malloc分配内存并返回指向该内存的指针。malloc不是系统调用,所以我认为它使用超出范围的局部变量 - 但它返回一个有效指针,指向分配给用户代码中的指针的有效内存块,并且可以向上传递调用链并且仍然完全有效。想法?
标签: c++ visual-studio-2019 shared-ptr compiler-warnings