使用make_shared<T>()而不是使用是否有任何缺点shared_ptr<T>(new T).
提升文档状态
用户一再请求工厂函数创建给定类型的对象并向其返回shared_ptr.除了方便和风格之外,这样的函数也是异常安全且相当快的,因为它可以对对象及其相应的控制块使用单个分配,从而消除了shared_ptr的构造开销的很大一部分.这消除了关于shared_ptr的主要效率投诉之一.
我正在使用std::shared_ptr,在我的软件开发过程中,我遇到了几个让我对内存管理产生怀疑的案例.我有一个第三方库,它总是给我提供函数的原始指针,在我的代码中我将它们转换为std::shared_ptr(从std而不是boost.顺便说一句,两者之间有什么区别?).所以我想说我有以下代码:
ClassA* raw = new ClassA;
std::shared_ptr<ClassA> shared(raw);
Run Code Online (Sandbox Code Playgroud)
现在当共享指针超出范围时会发生什么(假设它在函数中被声明为本地,现在我正在退出该函数).请问ClassA对象仍然存在,因为原始指针指向它?
当函数需要char*时,你能传入一个shared_ptr吗?
我正在读取整个文本文件(长度= 100),并希望将char存储到char []数组中.我使用的天真的方式是这样的:
ifstream dictFile(fileName);
size_t fileLength = 100;
char* readInBuffer(new char[fileLength]);
dictFile.read(readInBuffer, fileLength);
//processing readInBuffuer..............
delete[] readInBuffer;
dictFile.close();
Run Code Online (Sandbox Code Playgroud)
如果在delete []语句之前抛出异常,则会发生内存泄漏.我想知道我是否可以使用shared_ptr readInBuffer(new char [fileLength]); 但功能原型
读(char*s,streamsize n)
不会接受智能指针作为输入?任何招数?
编辑:我正在尝试写这样的东西:
shared_ptr<char[]> readInBuffer(new char[fileLength]);
dictFile.read(readInBuffer.get(), fileLength);
Run Code Online (Sandbox Code Playgroud)
但它不会编译.