如何推迟删除shared_ptr的操作?

时间:2015-05-25 06:59:46

标签: c++ pointers shared-ptr smart-pointers

我在main中创建了一个sample类的指针。我将此指针传递给函数function1()。此函数必须使用指针作为共享指针,并使用此指针执行某些操作。退出由于function1()而调用的sample析构函数shared_ptr。当我将相同的指针传递给不同的函数时,该指针不再有效,程序崩溃。

1.如何在function1()

中推迟删除操作(销毁调用)

2.什么是替代方式,以便我可以将指针传递给不同的函数并安全地使用它,尽管某些函数使用指针作为shared_ptr?

这里有示例代码和输出。

#include <memory>
#include <iostream>
#include <string.h>

using namespace std;

class sample
{
    private:
        char * data;

    public:
        sample( char * data )
        { 
            cout << __FUNCTION__ << endl;
            this->data = new char[strlen( data)];
            strcpy( this->data, data ); 

        }
        ~sample()
        {
            cout << __FUNCTION__ << endl; 
            delete this->data; 
        }
        void print_data()
        { 
            cout << __FUNCTION__ << endl;
            cout << "data = " << this->data << endl;
        }
};

void function1( sample * ptr )
{
    shared_ptr<sample> samp( ptr );
    /* do something with samp */
    ptr->print_data();
}

void function2( sample * ptr )
{
    ptr->print_data();
}

int main()
{
    char data[10] = "123456789";
    data[10] = '\0';
    sample * s = new sample( data );

    function1( s );
    function2( s );

    return 0;
}

输出:

sample
print_data
data = 123456789
~sample
print_data
data = 

2 个答案:

答案 0 :(得分:4)

更改

sample * s = new sample( data );

进入

shared_ptr<sample> s(new sample( data ));

并将共享的poiter传递给所有函数。当此变量超出范围时,它将被删除,因此对于您的目的而言已经足够晚了

答案 1 :(得分:4)

不应该这样做。如果您想共享指针的所有权,那么它应该创建作为shared_ptr,并作为shared_ptr传递给也想要共享所有权的函数。< / p>

也就是说,如果您真的知道自己正在做什么,并且 黑客攻击这些工作,您可以使用自定义删除工具什么都不做:

struct null_deleter {
    // Generic so it will work with any type!
    template< typename T >
    void operator()(T *p) const {}
};

void function1( sample * ptr )
{
    shared_ptr<sample> samp( ptr, null_deleter() );

    // I really hope this function isn't expecting
    // me to actually share ownership with it....
    something(samp); 

    ptr->print_data();
}