好吧,所以我最后一次以C++为生,std::auto_ptr所有的std lib都可用,而且boost::shared_ptr风靡一时.我从未真正研究过提供的其他智能指针类型.我知道C++ 11现在提供了一些类型的提升,但不是全部.
那么有人有一个简单的算法来确定何时使用哪个智能指针?优选地包括关于哑指针(诸如原始指针T*)和其他增强智能指针的建议.(像这样的东西会很棒).
鉴于可用性make_unique和make_shared自动删除unique_ptr以及shared_ptr析构函数,在C++ 14中使用new和使用的情况(除了支持遗留代码之外)是delete什么?
我觉得这个问题很基本,可以在某个地方出现,但我似乎无法找到答案.
假设我有这个代码:
//class member function
std::map< std::string, std::string > myMap;
const std::map< std::string, std::string >& bar()
{
return myMap;
}
void myFunc( std::map< std::string, std::string >& foo1 )
{
foo1 = bar();
std::map< std::string, std::string >& foo2 = bar();
}
Run Code Online (Sandbox Code Playgroud)
我的理解是,如果我开始使用foo2,因为foo2是对bar()返回的同一实例的引用,我用foo2做的任何事都将反映在myMap中.但是foo1怎么样?foo1是否获得了myMap的副本,还是指向与bar()返回的实例相同的实例?c ++标准库说std :: map的赋值运算符会复制元素,但这是否意味着在foo2的声明中没有真正调用赋值运算符?
谢谢!
当对象的指针返回并且程序员忘记删除它时,大多数内存泄漏都会出现.
例如:
class my_class
{
...
};
my_class* func1()
{
my_class* c = new my_class;
return c;
}
int main()
{
my_class* var1 = func1();
...
// Programmer forgot delete the var1: delete var1;
// -- or --
// Doesn't know 'delete[] var1;' is correct or 'delete var1;'.
}
Run Code Online (Sandbox Code Playgroud)
当指向创建对象的指针并且程序员忘记删除它时,会出现一些内存泄漏.
例如:
class my_class
{
...
};
void func2(my_class* p)
{
...
}
int main()
{
my_class* var3 = new my_class;
func2(var3);
// Does func2 deletes var3? Programmer doesn't know.
// …Run Code Online (Sandbox Code Playgroud) 指向以其他方式分配的东西在C++中是否合理安全?
到目前为止,我一直在使用STL容器(在一种情况下,一个数组,但这是另一个问题)满足我所有的动态内存需求,因此我不需要显式使用该new关键字.我也很乐意使用普通的ol' int *foo类型指针来引用事物.现在我正在阅读关于智能指针的内容(我在Java上磨口,所以我以前从未担心过这个问题)而传统的智慧似乎是"裸指针不好,不要使用它们".
那我有多麻烦?我可以安全地继续使用裸指针,只要它们指向的东西有其他破坏条件吗?这是我可以逃避的事情,但将来应该避免吗?或者这是一场灾难,我应该在匆忙之后修复?
据我所知,最好使用智能指针,而不是通过原始指针管理动态分配对象的生命周期,例如: MyObject* obj = new Object();
但是在某些框架/库中,它们总是返回/使用原始指针而不是智能指针(也许它们有自己的GC对象?我不知道).
它也更容易使用
MyObject* obj = GetAObject(); // return raw owning pointer
Run Code Online (Sandbox Code Playgroud)
比
SharedPointer<MyObject> obj = GetAObject(); // return smart pointer
Run Code Online (Sandbox Code Playgroud)
应该总是使用智能指针而不是手动new/ delete(如上例所示),还是应该使用原始资源拥有指针?