C++ 如何创建一个共享的ptr来传递给一个空函数*
差不多就是这样。我需要分配内存并将其传递给一个空的函数*。我想使用共享的ptr,但我不知道怎么做。你是说:C++ 如何创建一个共享的ptr来传递给一个空函数*,c++,boost,shared-ptr,C++,Boost,Shared Ptr,差不多就是这样。我需要分配内存并将其传递给一个空的函数*。我想使用共享的ptr,但我不知道怎么做。你是说: boost::shared_ptr<int> myInt(new int(5)); call_some_function(myInt.get()); 同样,内存属于向量 如果您的函数确实需要所有权,则无需将其包装成某些内容,因为您将不会管理它: call_some_function(new int); call_some_function(new char[blockSi
boost::shared_ptr<int> myInt(new int(5));
call_some_function(myInt.get());
同样,内存属于向量
如果您的函数确实需要所有权,则无需将其包装成某些内容,因为您将不会管理它:
call_some_function(new int);
call_some_function(new char[blockSize]);
确保函数将通过调用delete
/delete[]
来释放它。如果不是(例如,它打算使用free()
),则需要使用malloc
:
template <typename T>
T* malloc_new(void)
{
void* memory = std::malloc(sizeof(T));
if (!memory)
throw std::bad_alloc();
try
{
return new (memory) T();
}
catch(...)
{
std::free(memory);
throw;
}
}
call_some_function(malloc_new<int>());
call_some_function(malloc(blockSize));
模板
T*malloc_新(无效)
{
void*memory=std::malloc(sizeof(T));
如果(!内存)
抛出std::bad_alloc();
尝试
{
返回新的(内存)T();
}
捕获(…)
{
std::空闲(内存);
投掷;
}
}
调用某个函数(malloc_new());
调用一些函数(malloc(blockSize));
您还可以使用std::string作为引用计数内存blob容器。它与char*vector上的shared_ptr一样高效(可能更好)函数对参数做了什么?此外,我认为可以将内存分配为字符数组(例如使用std::vector
,并将&vec[0]
传递给函数)。头是预先准备好的,块是通过线路发送的。std::string
肯定不是引用计数的容器。当然是-规范不要求它,但所有实际实现都是-包括引用计数上的线程安全性,就像shared\u ptrI不认为VS/Dinkumware是引用计数的。没有使std::string
和shared_ptr
无论库选择采用何种优化,行为都相同,除非您处理的是不可变数据。这是智能指针使用的一个很小的子集。使用std::string是一个很糟糕的建议。+1,非常好的答案。在调用位置创建内存(当被调用函数拥有所有权时)时,当发生多个操作时,请注意:foo(bar(),new int(5))
如果在bar()
和bar()引发异常之前执行new int(5)
可能会泄漏。使用智能指针更安全(即使更长):std::auto_ptr p(新的int(5));foo(bar(),p.release())代码>不好,但安全。
template <typename T>
T* malloc_new(void)
{
void* memory = std::malloc(sizeof(T));
if (!memory)
throw std::bad_alloc();
try
{
return new (memory) T();
}
catch(...)
{
std::free(memory);
throw;
}
}
call_some_function(malloc_new<int>());
call_some_function(malloc(blockSize));