我需要一个智能指针结构 - 类似于 std::shared_ptr - 它为我提供了某种带有公开 Hook 的 API,回调到引用计数修改事件(例如释放/保留,又名 refcout 增量/减量)可以绑定(bind)。
我要么想自己实现,要么使用现成的东西,如果它存在的话。
比如,我希望在定义这个假定的 shared_ptr-ish 智能指针(就像delete-expressions 和 deleter functor 分别在 shared_ptr 和 unique_ptr 定义中使用。
编辑(来 self 下面的评论)——这就是我想要这个的原因:我目前有一个 Image 类模板,在它的核心,有一个 std::shared_ptr 持有一个(可能很大)连续的堆分配内存块。 Image 具有实现 hyperslab 迭代器(暴露例如颜色平面、CBIR 哈希数据等)的内部类,这些迭代器使用 std::weak_ptr 来引用所属 Image 实例的内存块。我想为特定的 refcounted 运行时扩展 Image——例如 Python c-api——并且绑定(bind)到现有的 std::shared_ptr refcounter 设备比保持两个不同的系统同步更可取。
最佳答案
shared_ptr 的默认实现有 shared_ptr,它们共享一个对象,所有对象都指向所谓的控制 block 。正是这个控制 block 保存了引用计数器,因此是可以更自然地对引用计数变化使用react的对象。
但是如果你真的想通过智能指针来完成它,下面的方法可能会起作用:
using std::shared_ptr;
template<class T> class sharedX_ptr;
// the type of function to call when a refcount change happens
template<class T>
void inc_callback(const sharedX_ptr<T>& p)
{
std::cout << "Increasing refcount via " << &p
<< ", for object: " << p.get() << ", use_count: " << p.use_count()
<< std::endl;
}
template<class T>
void dec_callback(const sharedX_ptr<T>& p)
{
std::cout << "About to decrease refcount via " << &p
<< ", for object: " << p.get() << ", use_count: " << p.use_count()
<< std::endl;
}
template<class T>
class sharedX_ptr : public shared_ptr<T>
{
typedef void (*callback)(const sharedX_ptr<T>&);
callback inc, dec;
public:
typedef shared_ptr<T> base;
sharedX_ptr(const sharedX_ptr& p) : base(p), inc(p.inc), dec(p.dec)
{ if (this->get()) inc(*this); }
template<class U>
sharedX_ptr(sharedX_ptr<U>&& p) : base(std::move(p)), inc(p.inc), dec(p.dec)
{ /*if (this->get()) inc(*this);*/ }
template<class U>
sharedX_ptr(shared_ptr<U> p, callback i = inc_callback<T>, callback d = dec_callback<T>)
: shared_ptr<T>(std::move(p)), inc(i), dec(d)
{ if (this->get()) inc(*this); }
sharedX_ptr& operator=(sharedX_ptr&& p) {
if (this != &p) {
if (this->get()) dec(*this);
base::operator=(std::move(p)); inc = p.inc; dec = p.dec;
/* if (this->get()) inc(*this); */
}
return *this;
}
template<class U>
sharedX_ptr& operator=(const sharedX_ptr& p) {
if (this != &p) {
if (this->get()) dec(*this);
base::operator=(p); inc = p.inc; dec = p.dec;
if (this->get()) inc(*this);
}
return *this;
}
void reset() { if (this->get()) dec(*this); shared_ptr<T>::reset();}
~sharedX_ptr() { if (this->get()) dec(*this); }
};
关于c++ - `std::shared_ptr` 的智能指针模拟,带有用于将回调绑定(bind)到引用计数修改事件的 API,例如释放/保留……这是一回事吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34283409/
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
下面例子中的Nested和Child有什么区别?是否只是同一事物的不同语法?classParentclassNested...endendclassChild 最佳答案 不,它们是不同的。嵌套:Computer之外的“Processor”类只能作为Computer::Processor访问。嵌套为内部类(namespace)提供上下文。对于ruby解释器Computer和Computer::Processor只是两个独立的类。classComputerclassProcessor#Tocreateanobjectforthisc
所以我开始关注ruby,很多东西看起来不错,但我对隐式return语句很反感。我理解默认情况下让所有内容返回self或nil但不是语句的最后一个值。对我来说,它看起来非常脆弱(尤其是)如果你正在使用一个不打算返回某些东西的方法(尤其是一个改变状态/破坏性方法的函数!),其他人可能最终依赖于一个返回对方法的目的并不重要,并且有很大的改变机会。隐式返回有什么意义?有没有办法让事情变得更简单?总是有返回以防止隐含返回被认为是好的做法吗?我是不是太担心这个了?附言当人们想要从方法中返回特定的东西时,他们是否经常使用隐式返回,这不是让你组中的其他人更容易破坏彼此的代码吗?当然,记录一切并给出
这个问题在这里已经有了答案:Arraysmisbehaving(1个回答)关闭6年前。是否应该这样,即我误解了,还是错误?a=Array.new(3,Array.new(3))a[1].fill('g')=>[["g","g","g"],["g","g","g"],["g","g","g"]]它不应该导致:=>[[nil,nil,nil],["g","g","g"],[nil,nil,nil]]
尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot
我正在尝试按0-9和a-z的顺序创建数字和字母列表。我有一组值value_array=['0','1','2','3','4','5','6','7','8','9','a','b','光盘','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','','u','v','w','x','y','z']和一个组合列表的数组,按顺序,这些数字可以产生x个字符,比方说三个list_array=[]和一个当前字母和数字组合的数组(在将它插入列表数组之前我会把它变成一个字符串,]current_combo['0','0','0']