Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何创建一个共享的ptr来传递给一个空函数*_C++_Boost_Shared Ptr - Fatal编程技术网

C++ 如何创建一个共享的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

差不多就是这样。我需要分配内存并将其传递给一个空的函数*。我想使用共享的ptr,但我不知道怎么做。

你是说:

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));