如何延迟shared_ptr的删除操作?
how to defer delete operation of shared_ptr?
我在 main 中创建了一个 sample
class 的指针。我将此指针传递给函数 function1()
。这个函数必须使用指针作为共享指针,并使用这个指针做一些操作。在 function1()
退出期间 sample
的析构函数由于 shared_ptr
而被调用。当我将相同的指针传递给不同的函数时,该指针不再有效并且程序崩溃。
1.How 我要在 function1()
中推迟删除操作(销毁调用)吗?
2.What 是另一种方法,这样我就可以将指针传递给不同的函数并安全地使用它,尽管有些函数使用指针作为 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] = '[=11=]';
sample * s = new sample( data );
function1( s );
function2( s );
return 0;
}
输出:
sample
print_data
data = 123456789
~sample
print_data
data =
改变
sample * s = new sample( data );
进入
shared_ptr<sample> s(new sample( data ));
并将共享指针传递给所有函数。当这个变量超出范围时它将被删除,对于你的目的来说已经足够晚了
你不应该这样做。如果你想共享指针的所有权,那么应该 创建 作为 shared_ptr
,并作为 shared_ptr
传递给也想共享的函数所有权。
就是说,以防万一你真的知道你在做什么,并且你有破解一些东西来完成这项工作,您可以使用不执行任何操作的自定义删除器:
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();
}
我在 main 中创建了一个 sample
class 的指针。我将此指针传递给函数 function1()
。这个函数必须使用指针作为共享指针,并使用这个指针做一些操作。在 function1()
退出期间 sample
的析构函数由于 shared_ptr
而被调用。当我将相同的指针传递给不同的函数时,该指针不再有效并且程序崩溃。
1.How 我要在 function1()
中推迟删除操作(销毁调用)吗?
2.What 是另一种方法,这样我就可以将指针传递给不同的函数并安全地使用它,尽管有些函数使用指针作为 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] = '[=11=]';
sample * s = new sample( data );
function1( s );
function2( s );
return 0;
}
输出:
sample
print_data
data = 123456789
~sample
print_data
data =
改变
sample * s = new sample( data );
进入
shared_ptr<sample> s(new sample( data ));
并将共享指针传递给所有函数。当这个变量超出范围时它将被删除,对于你的目的来说已经足够晚了
你不应该这样做。如果你想共享指针的所有权,那么应该 创建 作为 shared_ptr
,并作为 shared_ptr
传递给也想共享的函数所有权。
就是说,以防万一你真的知道你在做什么,并且你有破解一些东西来完成这项工作,您可以使用不执行任何操作的自定义删除器:
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();
}