История изменений
Исправление Gvidon, (текущая версия) :
У меня вот такой вариант завёлся:
#include <iostream>
#include <tr1/memory>
struct MyDeleter
{
MyDeleter(): del(true) {}
template <typename T>
void operator()(T * ptr)
{
if (del)
delete ptr;
}
void setDelete(bool d)
{
del = d;
}
private:
bool del;
};
struct MyClass
{
MyClass(const std::string &s): str(s) {}
void say()
{
std::cout << str << std::endl;
}
private:
std::string str;
};
int main()
{
MyClass *c_ptr = new MyClass("hello");
std::tr1::shared_ptr<MyClass> ptr(c_ptr, MyDeleter());
MyDeleter *deltr = std::tr1::get_deleter<MyDeleter, MyClass>(ptr);
std::cout << deltr << std::endl;
if (deltr)
deltr->setDelete(false);
ptr.reset();
c_ptr->say();
}
Исходная версия Gvidon, :
У меня вот такой вариант завёлся:
#include <iostream>
#include <tr1/memory>
struct MyDeleter
{
MyDeleter(): del(true) {}
template <typename T>
void operator()(T * ptr)
{
if (del)
delete ptr;
}
void setDelete(bool d)
{
del = d;
}
private:
bool del;
};
struct MyClass
{
MyClass(const std::string &s): str(s) {}
void say()
{
std::cout << str << std::endl;
}
private:
std::string str;
};
int main()
{
MyClass *c_ptr = new MyClass("hello");
std::tr1::shared_ptr<MyClass> ptr(c_ptr, MyDeleter());
MyDeleter *deltr = std::tr1::get_deleter<MyDeleter, MyClass>(ptr);
std::cout << deltr << std::endl;
if (deltr)
deltr->setDelete(false);
ptr.reset();
c_ptr->say();
}