请教:boost::shared_ptr自定义析构器的问题. [问题点数:40分,结帖人s_51563946]

Bbs1
本版专家分:1
结帖率 100%
Bbs9
本版专家分:93003
Blank
进士 2008年 总版技术专家分年内排行榜第五
Blank
铜牌 2007年6月 总版技术专家分月排行榜第三
Blank
红花 2007年6月 VC/MFC大版内专家分月排行榜第一
Blank
黄花 2008年5月 C/C++大版内专家分月排行榜第二
2008年3月 C/C++大版内专家分月排行榜第二
2007年10月 C/C++大版内专家分月排行榜第二
2007年9月 C/C++大版内专家分月排行榜第二
2007年6月 C/C++大版内专家分月排行榜第二
2007年5月 C/C++大版内专家分月排行榜第二
Bbs9
本版专家分:86280
Blank
红花 2011年3月 C/C++大版内专家分月排行榜第一
2010年9月 C/C++大版内专家分月排行榜第一
Blank
黄花 2015年1月 C/C++大版内专家分月排行榜第二
2012年3月 C/C++大版内专家分月排行榜第二
2011年11月 C/C++大版内专家分月排行榜第二
2010年6月 C/C++大版内专家分月排行榜第二
2010年5月 C/C++大版内专家分月排行榜第二
Blank
蓝花 2011年4月 C/C++大版内专家分月排行榜第三
2011年2月 C/C++大版内专家分月排行榜第三
2010年8月 C/C++大版内专家分月排行榜第三
Bbs8
本版专家分:41106
Blank
黄花 2009年3月 C/C++大版内专家分月排行榜第二
Bbs1
本版专家分:1
Bbs9
本版专家分:93003
Blank
进士 2008年 总版技术专家分年内排行榜第五
Blank
铜牌 2007年6月 总版技术专家分月排行榜第三
Blank
红花 2007年6月 VC/MFC大版内专家分月排行榜第一
Blank
黄花 2008年5月 C/C++大版内专家分月排行榜第二
2008年3月 C/C++大版内专家分月排行榜第二
2007年10月 C/C++大版内专家分月排行榜第二
2007年9月 C/C++大版内专家分月排行榜第二
2007年6月 C/C++大版内专家分月排行榜第二
2007年5月 C/C++大版内专家分月排行榜第二
Bbs8
本版专家分:41106
Blank
黄花 2009年3月 C/C++大版内专家分月排行榜第二
Bbs1
本版专家分:1
Bbs9
本版专家分:86280
Blank
红花 2011年3月 C/C++大版内专家分月排行榜第一
2010年9月 C/C++大版内专家分月排行榜第一
Blank
黄花 2015年1月 C/C++大版内专家分月排行榜第二
2012年3月 C/C++大版内专家分月排行榜第二
2011年11月 C/C++大版内专家分月排行榜第二
2010年6月 C/C++大版内专家分月排行榜第二
2010年5月 C/C++大版内专家分月排行榜第二
Blank
蓝花 2011年4月 C/C++大版内专家分月排行榜第三
2011年2月 C/C++大版内专家分月排行榜第三
2010年8月 C/C++大版内专家分月排行榜第三
Bbs6
本版专家分:6786
关于boost::shared_ptr的!=, == 重载
关于<em>boost</em>::<em>shared_ptr</em>的!=, == 重载rnrn大家好,rnrn有段代码rn-------------------rn///rnA* createA();rnrn///客户端代码rnif( createA() == NULL )...rnif( createA() != NULL )...rnif( NULL == createA() )...rnif( NULL != createA() )...rn------------------rn我因为有些需求,做了一些重构:rnclass Basernrn...rn void* raw() = 0;rnrn///rnclass WrapA : public Basernrn...rn void* raw() return m_handle; rnrnprivate:rn A* m_handle;rnrn///原先的createA()被重构成这样rn<em>boost</em>::<em>shared_ptr</em> createA2();rnrn客户端代码:rnif( createA() == NULL )...rnif( createA() != NULL )...rnif( NULL == createA() )...rnif( NULL != createA() )...rn不能改为:rnif( createA2() == NULL )...rnif( createA2() != NULL )...rnif( NULL == createA2() )...rnif( NULL != createA2() )...rn而必须改为: rnif( createA2()->raw() == NULL )...rnif( createA2()->raw() != NULL )...rnif( NULL == createA2()->raw() )...rnif( NULL != createA2()->raw() )...rnrn<em>问题</em>是客户端类似这样:rnif( createA() == NULL )rn的代码很多, 很容易在替换的时候写成(忘记加->raw())rnif( createA2() == NULL)rn而产生bug.rnrnrn我的<em>问题</em>是, 在重构出Base,WarpA后, 如何尽可能少改动客户端的代码而不出错?rn比如, 有没有在客户端代码被改为:rnif( createA2() == NULL)rn的情况下,仍然正确执行?rnrnrn我能想到的方法是重载<em>boost</em>::<em>shared_ptr</em><>的==和!=操作符, rn尝试了方法1:rninline bool operator==(<em>boost</em>::<em>shared_ptr</em> const& a, <em>boost</em>::<em>shared_ptr</em> const& b)return (a->raw() == b->raw());rninline bool operator!=(<em>boost</em>::<em>shared_ptr</em> const& a, <em>boost</em>::<em>shared_ptr</em> const& b)return (a->raw() != b->raw());rn调试发现if( createA2() == NULL)处无法执行我重载的==和!=rnrnrn又尝试了方法2:rninline bool operator==(<em>boost</em>::<em>shared_ptr</em> const& a, const Base* b)return (a->raw() == b->raw());rninline bool operator!=(<em>boost</em>::<em>shared_ptr</em> const& a, const Base* b)return (a->raw() != b->raw());rn发现if( createA2() == NULL)可以执行我重载的==,rn但if( NULL == createA2() )无法执行我重载的==,rn所以, 为了正确执行if( NULL == createA2() ), 我必须再加上:rninline bool operator==(const Base* a, <em>boost</em>::<em>shared_ptr</em> const& b)return (a->raw() == b->raw());rninline bool operator!=(const Base* a, <em>boost</em>::<em>shared_ptr</em> const& b)return (a->raw() != b->raw());rnrn虽然方法2的4个重载函数可以满足我的要求(目前没发现缺陷), 但我觉得重载4个函数不够简洁.rn所以想<em>请教</em>一下, 有没有别的更好的方法.rnrn谢谢rnrnPS:积分不多了, 所以只能给这些分数了, 抱歉
boost::shared_ptr定制删除器
我的<em>shared_ptr</em>保存的是一些对话框指针,所以<em>析构</em>的时候需要调用dlg->DestoryWindow(); 有没有可能写成泛型的定制删除器呢?rn比如:rnrntemplaternvoid CustomDestroy(T *x)rnrn if(x != NULL )rn x->DestroyWindow();delete x;x=NULL;rn;rnrn求解答
boost的指针智能指针(shared_ptr
<em>boost</em>智能指针常用的函数 get()获取原始指针 bool unique()检测是否唯一 long use_count()引用计数 void swap()交换指针 reset()将引用计数减1,停止对指针的共享,除非引用计数为0,否则不会发生删除操作。 操作函数: <em>shared_ptr</em>&lt;int&gt; spi(new int);//一个int型的<em>shared_ptr</em> as...
boostshared_ptr循环引用(1)
A.h #include "B.h" class A { public: A(); virtual ~A(); public: BPtr m_ptrB; } typedef <em>boost</em>::shard_ptr APtr; B.h class B { public: B(); virtual ~
关于boost::shared_ptr 向下转型
书上说把一个基类指针转向子类指针,不能使用类似static_cast(p.get() ),而应该使用static_pointer_cast().因为前者转换后的指针不再会被<em>shared_ptr</em>正确的管理。rn我觉得两种都可以,第一种方法转换出来的指针就是一个普通的指针,跟<em>shared_ptr</em>又没什么关系(只要不去delete这个指针就行,让<em>shared_ptr</em>去完成delete)。
boost::shared_ptr的线程安全
官方文档的说明 <em>shared_ptr</em> objects offer the same level ofthread safety as built-in types. A <em>shared_ptr</em> instance can be "read"(accessed using only const operations) simultaneously by multiple threads.Differe
boostshared_ptr循环引用
<em>boost</em>的智能指针给编程带来了极大的便利,不需要关心内存的释放,不要要调用delete,而且还可以定制delete的方法。其实<em>boost</em>的智能指针是可以当成scope_exit来用的,同样是退出时处理。但是凡事都是有利有弊,<em>boost</em>的<em>shared_ptr</em>如果在循环引用的时候会出现无法释放内存的情况,所谓循环引用就是A智能指针类里存放B的智能指针,B的智能指针类里存放A,将a、b的值互相设置。增
Boost之shared_ptr使用陷阱
Boost库是一个优秀的、可移植、开源的C++库, 它由C++标准委员会库工作组成员发起,其中有些内容经常成为下一代C++标准库的内容,在C++社区中影响甚大,是不折不扣的“准”标准库。Boost库由于其对跨平台,对标准C++的支持,开源,高效等优点,如今已经被广泛运用于企业级开发。
Boost序列化std::shared_ptr
大家好,在此求助两个<em>boost</em>::serialization相关<em>问题</em>。rn1.智能指针<em>boost</em>::<em>shared_ptr</em> p_mData会通过Widget来初始化,那么在这里编译器会报错,原因是没有办法通过void类型找到Widget类型的serialize方法。类ToBeSerialize是已经设计好了的,请问有无办法规避此<em>问题</em>?rn[code=c]class Widgetrnrn int data;rn friend class <em>boost</em>::serialization::access;rn template rn friend void serialize(Archive& ar, Widget& widget, rn const unsigned int version);rn;rnclass ToBeSerializernrn <em>boost</em>::<em>shared_ptr</em> p_mData;rn friend class <em>boost</em>::serialization::access;rn template rn friend void serialize(Archive& ar, ToBeSerialize& tobeserialize, rn const unsigned int version);rn[/code]rnrnrn2.老生常谈。<em>boost</em>::serialization无法序列化std::<em>shared_ptr</em>. 请问大家有没有高招在不修改<em>boost</em>库文件的情况下(无需重新编译动态库),使下面的种序列化变得可能。单纯修改头文件可以接受。rn[code=c]rnclass ToBeSerializernrn std::<em>shared_ptr</em> p_mData;rn friend class <em>boost</em>::serialization::access;rn template rn void serialize(Archive& ar, const unsigned int version)rn rn ar & BOOST_SERIALIZATION_NVP(p_mData);rn rn[/code]
boost shared_ptr delete的时候
请问 <em>boost</em> <em>shared_ptr</em> delete的时候 是否有try catch的 异常处理。rnrn我是指<em>shared_ptr</em><em>析构</em>时会去调用T的<em>析构</em>函数,并且delete掉。如果这个过程有异常,是否进行了出错处理。
请教一下boost::shared_ptr的线程安全问题
<em>请教</em>一下<em>boost</em>::<em>shared_ptr</em>的线程安全<em>问题</em>rnrn看了一下<em>boost</em>的官网关于<em>shared_ptr</em>线程安全的那一小结,rnrnhttp://www.<em>boost</em>.org/doc/libs/1_53_0/libs/smart_ptr/<em>shared_ptr</em>.htm#ThreadSafetyrnrn前面提到的那几个线程安全需要注意的地方,后面则说在1.33版本之后加入了lock-free,这个意思是1.33版本以后都是线程安全的不需要注意前面的那几个例子吗?rnrn感觉有些歧义我按他说的写了些例子,虽然有崩溃的情况但都是new的时候出现错误(new的太频繁),貌似和线程没关系,所以求教。rnrn[code=c]rn#include rn#include rn#include rn#include rn#include rn#include rn#include rn#include rn#include rn<em>boost</em>::<em>shared_ptr</em> p(new int(42));rnrnrnunsigned int __stdcall threadfunA(void* arg)rnrn while(1)rn rn p.reset(new int(1));rn Sleep(1);rn rn return 0;rnrnrnunsigned int __stdcall threadfunB(void* arg)rnrn while(1)rn rn p.reset(new int(1));rn Sleep(1);rn rn return 0;rnrnrnrnint main()rnrn HANDLE client;rn client = (HANDLE) _beginthreadex (NULL, 0,rn threadfunA, 0, 0 , NULL);rn if (client == 0) rn printf ("error1 in _beginthreadex\n");rn return -1;rn rnrn HANDLE client2;rn client2 = (HANDLE) _beginthreadex (NULL, 0,rn threadfunB, 0, 0 , NULL);rn if (client2 == 0) rn printf ("error2 in _beginthreadex\n");rn return -1;rn rnrn system("pause");rn return 0;rnrnrnrn[/code]
100分 请教 boost::shared_ptr 剖析
[code=C/C++]rnint main()rnrn <em>boost</em>::<em>shared_ptr</em> temp(new int(14));rn rn <em>boost</em>::<em>shared_ptr</em> ff ;rnrn ff = temp;rnrn cout< & other) // never throwsrn rn std::swap(px, other.px);rn pn.swap(other.pn);rn rn[/code]rnrn再进入rn[code=C/C++]rntemplate inlinern void swap(_Ty& _Left, _Ty& _Right)rn // exchange values stored at _Left and _Rightrn _Ty _Tmp = _Left;rn _Left = _Right, _Right = _Tmp;rn rn[/code]rnrn好了,这已经很明显看到是交换两个变量的值,监视变量,一开始 _Right 为 0x00000000,在函数结束时 _Left 为0x00000000。很正常,继续单步执行rnrn到rnrn[code=C/C++]rn <em>shared_ptr</em> & operator=( <em>shared_ptr</em> const & r ) // never throwsrn rn this_type(r).swap(*this);rn return *this;rn rn[/code]rnrn按上面的swap 函数来看,这时r 应该为0x00000000,但却不是,为什么??????rnrn而且我也一直没找到 use_count_ 和 weak_count_ 在哪改变值。
析构器 Destructor 问题
大家好, 我在写一元多项式的加法和乘法, 如果我在Polynomial类里边加上<em>析构</em>器去清除一元多项式里的所有项, 那么程序运行到中间会终止, 如果不加就没事rn这是Polynomial类的源码, 请问<em>问题</em>出在哪里, 应该怎么修改, 谢谢...rnrn//File Polinomial.hrn#ifndef POLYNOMIAL_Hrn#define POLYNOMIAL_Hrnrn#include "Node.h"rnrnclass Polynomialrn public:rn Polynomial(); // constructorrn Polynomial(Polynomial & ); // copy constructorrn ~Polynomial(); // destructorrn void addTerm(int, int); // add term to the polynomialrn Polynomial add(Polynomial & ); // add two polynomials togetherrn Polynomial multiply(Polynomial & ); // multiply two polynomialsrn Polynomial operator + (Polynomial & ); // + operator overloadingrn Polynomial operator * (Polynomial & ); // * operator overloadingrn void sortTerms(); // sort the exponents in descending orderrn void print(); // print the polynomialrn rn private:rn Node* head;rn Node* current; // a pointer to go along the polynomial linked listrn int totalTerms; // keep trap the number of terms in the polynomialrn;rnrn#endifrnrnrnrnrnrnrnrnrnrnrnrnrnrnrnrnrnrnrn//File Polynomial.cpprn#include rn#include "Node.h"rn#include "Polynomial.h"rnrnusing namespace std;rnrn// ContructorrnPolynomial :: Polynomial()rnrn head = NULL; // initially, the polynomial is emptyrn totalTerms = 0;rnrnrn// Copy ConstructorrnPolynomial :: Polynomial(Polynomial & rightPoly)rnrn head = NULL;rn totalTerms = 0;rn rn rightPoly.current = rightPoly.head;rn rn // make a deep copy of the passing polynomialrn for(int i = 0; i < rightPoly.totalTerms; i++)rn rn (*this).addTerm(rightPoly.current -> getCOEF(), rightPoly.current -> getEXP());rn rightPoly.current = rightPoly.current -> getLink();rn rnrnrnvoid Polynomial :: addTerm(int coef, int expo)rn rn if(head == NULL)rn rn head = new Node(coef, expo, NULL);rn current = head;rn totalTerms++;rn rn elsern rn insert(current, coef, expo);rn current = current -> getLink();rn totalTerms++;rn rnrnrn// This function adds two polynomial together.rnPolynomial Polynomial :: add(Polynomial & rightSide)rnrn Polynomial pRight(rightSide), sum;rn rn if(head == NULL) // if left side is empty, then sum equals right sidern sum = pRight; rn else if(rightSide.head == NULL) // if right side is empty, then sum equals left sidern sum = *this;rn elsern rn // make current node point back to headrn current = head;rn pRight.current = pRight.head;rn rn for(int i = 0; i < totalTerms; i++)rn rn // check if the right side polynomial has a term with thern // same exponent as the current term in the left pollynomialrn Node* target = search(pRight.head, current -> getEXP());rn rn if(target != NULL) // if find the targetrn rn // add two both coeifficients together, and add to the sum pollynomialrn sum.addTerm(current -> getCOEF() + target -> getCOEF(), current -> getEXP());rn current = current -> getLink(); // current points to next termrn rn // delete the target in the right side polynomialrn if(target == pRight.head) // if target is the head termrn rn deleteFirstNode(pRight.head);rn pRight.totalTerms--; // decrease total terms by 1rn rn else // if target is not headrn rn // find the term before the target termrn for(int i = 0; i < pRight.totalTerms; i++)rn if(pRight.current -> getLink() == target)rn break;rn elsern pRight.current = pRight.current -> getLink();rn rn // pRight.current now is before the target term rn deleteNode(pRight.current); // delete the target term that's not the head but after the current termrn pRight.totalTerms--; // decrease total terms by 1rn pRight.current = pRight.head; // current points back to headrn rn rn else // if target is not foundrn rn sum.addTerm(current -> getCOEF(), current -> getEXP()); // copy the current term to the sumrn current = current -> getLink(); // current goes to next termrn rn rn rn // check if right side pollynomial has terms leftrn // copy them to sumrn while(pRight.totalTerms != 0)rn rn sum.addTerm(pRight.head -> getCOEF(), pRight.head -> getEXP());rn deleteFirstNode(pRight.head);rn pRight.totalTerms--; rn rn rn rn rn return sum;rnrnrn// This function multiplies two polynomial.rnPolynomial Polynomial :: multiply(Polynomial & rightSide)rnrn Polynomial product;rn rn current = head;rn rightSide.current = rightSide.head;rn rn for(int i = 0; i < totalTerms; i++)rn rn Polynomial sum;rn rn for(int j = 0; j < rightSide.totalTerms; j++)rn rn int coef = current -> getCOEF() * rightSide.current -> getCOEF();rn int expo = current -> getEXP() + rightSide.current -> getEXP();rn rn sum.addTerm(coef, expo);rn rn rightSide.current = rightSide.current -> getLink();rn rn rn product = product.add(sum);rn current = current -> getLink();rn rightSide.current = rightSide.head; // set the current back to the right side headrn rn rn return product; rnrnrn// This function sorts the terms in a polynomial in descending order of the exponents.rnvoid Polynomial :: sortTerms()rnrn if(head != NULL)rn rn //Declares and initializes the boolean value changed to be false.rn bool changed = false;rn Node *after;rn rn //Executes the following statements at least once.rn dorn rn //Changes the boolean value to be false before each iteration.rn changed = false;rn rn current = head;rn after = current -> getLink();rn rn //Loops to sort the array.rn for(int i = 0; i < totalTerms - 1; i++)rn rn //On each pass, successive neighboring pairs are compared. rn //If a pair is in decreasing order, its values are swapped; rn //otherwise, the values remain unchanged. rn if(current -> getEXP() < after -> getEXP())rn rn int tempCOEF = current -> getCOEF();rn int tempEXP = current -> getEXP();rn current -> setCOEF(after -> getCOEF());rn current -> setEXP(after -> getEXP()); rn after -> setCOEF(tempCOEF);rn after -> setEXP(tempEXP);rn rn //Changes the variable changed to be true.rn changed = true;rn rn rn current = current -> getLink();rn after = current -> getLink();rn rn while(changed); //Continue if changed is true.rn rnrnrn// This function prints out the polynomial.rnvoid Polynomial :: print()rnrn if(totalTerms != 0)rn rn current = head;rn rn for(int i = 0; i < totalTerms; i++)rn rn if(current != head && current -> getCOEF() >= 0) // put a "+" sign before positive coefficientrn cout << "+" << current -> getCOEF() << "x" << "^" << current -> getEXP();rn elsern cout << current -> getCOEF() << "x" << "^" << current -> getEXP();rn rn current = current -> getLink(); rn rn rn elsern cout << "The polynomial is empty.";rn rn cout << endl << endl;rnrnrn// + operator overloadingrnPolynomial Polynomial :: operator + (Polynomial & rightSide)rnrn return (*this).add(rightSide);rnrnrn// + operator overloadingrnPolynomial Polynomial :: operator * (Polynomial & rightSide)rnrn return (*this).multiply(rightSide);rnrnrn// DestructorrnPolynomial :: ~Polynomial()rnrn cout << "Destructing...";rn rn //for(int i = 0; i < totalTerms; i++) ///////////////////////////////----------------Error Here.rn // deleteFirstNode(head);rnrnrnrn#include rn#include "Polynomial.h"rnrnusing namespace std;rnrnint main()rnrn Polynomial poly1, poly2, poly3, poly4;rnrn poly1.addTerm(2, 2);rn poly1.addTerm(2, 0);rn rn poly2.addTerm(3, 1);rn poly2.addTerm(1, 0);rnrn rn poly1.print();rn poly2.print();rn rn poly3 = poly1 + poly2;rn rn poly3.sortTerms();rn rn poly3.print();rn rn poly4 = poly1 * poly2;rn rn poly4.sortTerms();rn rn poly4.print();rn rn return 0; rn//end mainrn
关于java的析构问题,请教大家!
在java里面不是有一个finalize函数吗?它是如何运行的啊?在什么时间?当时的内存是什么状态啊?rn还有就是dispose的用法如何?希望高手指点啊?
boost中的shared_ptr的一些理解
<em>shared_ptr</em>由成员模板参数类型的指针和shared_count对象组成,shared_count表示为引用计数对象,主要是通过shared_count对象的拷贝构造函数或者赋值运行符来实现引用 计数的增加,shared_count对象的<em>析构</em>函数将引用计数减1,如果发现引用计数为0,就回收对象。 <em>shared_ptr</em>的reset()方法是通过与临时对象交换,但是当临时对象<em>析构</em>时,对象的引用
boostshared_ptr的一个疑问
rn[code=c]rntemplate rnclass <em>shared_ptr</em>rnrnpublic:rn //一些声明...rnrn template< class Y >rn <em>shared_ptr</em>( <em>shared_ptr</em> const & r, element_type * p ) BOOST_NOEXCEPT : px( p ), pn( r.pn )rn rn rnrnprivate:rnrn element_type * px; // contained pointerrn <em>boost</em>::detail::shared_count pn; // reference counterrn}rn[/code]rnrn我想问, rn<em>shared_ptr</em> pd(new Derive);rn<em>shared_ptr</em> pb(pd); //1rn这样的话,这个“拷贝构造”函数是怎么工作的。rn因为,对于1处,两个模板形参是不同的,左边是 T=Base,右边是Y=Derivern那么上面的“拷贝构造”中的 pn( r.pn ) 应该无法访问到 <em>shared_ptr</em>的私有成员才对rn但是使用的时候并不会报错,求解
如何使用boost::shared_ptr p_Cxxx;
在先前的讨论中,发现在vector中存放指针确实是存在一定的隐患,所以打算使用rn<em>boost</em>::<em>shared_ptr</em>,如果运行环境是vc6,那如何才能把<em>boost</em>::<em>shared_ptr</em>引入进来?另外大家能否介绍一下介绍<em>boost</em>的资料和书籍,谢谢大家
boost shared_ptr等智能指针的使用
Java的垃圾回收不是很慢吗,那<em>boost</em> <em>shared_ptr</em>等智能指针的使用对执行速度影响会大吗,一般在项目开发中会使用吗,另外小弟学习C++已经一年了,现在总感觉不知道怎么学下去对具体的开发很迷茫,现求一些经典项目的源代码参考一下,希望哪位大神可以为小弟提供以下,好人一生平安
Boost之共享所有权的智能指针shared_ptr
Boost库是一个优秀的、可移植、开源的C++库, 它由C++标准委员会库工作组成员发起,其中有些内容经常成为下一代C++标准库的内容,在C++社区中影响甚大,是不折不扣的“准”标准库。Boost库由于其对跨平台,对标准C++的支持,开源,高效等优点,如今已经被广泛运用于企业级开发。
关于boostshared_ptr的疑问
<em>shared_ptr</em>被很多人说成是最好用的智能指针。今天刚刚开始学习就遇到了一个<em>问题</em>。<em>shared_ptr</em>的传参数<em>问题</em>。比如,对于CreateThread函数的第4个参数可以传一个lpvoid指针作为参数穿进去的,也就是任意类型的指针,但是不能够将 <em>shared_ptr</em>作为lpvoid传入。当然可以将<em>shared_ptr</em>中的指针提取出来,但是这样就导致计数并不记录比如下面的程序片段: rntypedef struct InsertData rnrn int iNum;rn char cData[10];rn InsertData()rn rn iNum = 10;rn ZeroMemory(cData, 10);rn rnINSERT, *PINSERTrn//////////////////////////////////////////////////////////////////////rnvoid fun()rnrn INSERT* pInsertData = new INSERT;rn <em>boost</em>::<em>shared_ptr</em> shTest(pInsertData);rn char cData[5] = 'a','b','c','d';rn memcpy(pInsertData->cData, cData, 4);rn m_hThread = CreateThread(NULL, 0, ThreadFunc,(LPVOID)&(*shTest), NULL, 0);rn Sleep(2000);rnrnrnDWORD ThreadFunc(LPVOID pParam)rnrn <em>boost</em>::<em>shared_ptr</em> pThreadShared((INSERT*)pParam);rn int i = 0;rn for (int j = 0; j < 10; j++)rn rn i++;rn TRACE("第%d次输出%s\n", i, pThreadShared->cData);rn Sleep(1000);rn rn Sleep(5000);rn return 0;rnrnrn这个程序执行结果显示只有第一次和第二次输出结果正确,之后的就是错误指针。意味着计数没有将这个参数传递记录,fun函数结束后就已经释放了。那么我想问有什么方法可以让它记录呢。当然你可以说直接使用<em>boost</em>的多线程,但是在实际工程中有很多第三方提供的借口参数就是void*类型,是不是这种情况下智能指针就没有作用了呢。求教各位大侠
boost::shared_ptr 进行数据管理
我们经常遇到这样的情况, 类A和类B同时需要使用类C这个数据。那么类C这个数据由谁来存储呢? 比如:有个Student A, Class C(班级), Student Union SU(学生会), 这个学生A既可能是班级C的一员,也可能是学生会SU的一员。 下面是一个demo。 #include #include #include #include class Student { p
关于boost::shared_ptr增加引用计数据问题
我有个函数接受一个<em>boost</em>::<em>shared_ptr</em>类型的参数,我想保留<em>shared_ptr</em>引用的指针,该怎么做?rn[code=C/C++]rnclass Xrnrnpublic:rn ~X() delete p; rn void fn(<em>boost</em>::<em>shared_ptr</em> i)rn rn p = i.get(); // 这儿应该增加i的引用计数rn // 因为i中的指针我是放在<em>析构</em>函数中删除的.rn // 该怎么增加i的引用计数?rn rnprivate:rn int* p;rn;rnrnvoid method()rnrn <em>boost</em>::<em>shared_ptr</em> i(new int(10));rn X x;rn x.fn(i);rnrn[/code]
初学boost请教shared_ptr问题
[code=c]rn#include rn#include rnusing namespace std;rnrn<em>boost</em>::<em>shared_ptr</em> get( const char * s ) rn rn <em>boost</em>::<em>shared_ptr</em> text( s );rn return text;rn rnrnvoid print( <em>boost</em>::<em>shared_ptr</em> text ) rn rn std::cout << text << endl; rn rnrnint main(int argc, char *argv[]) rn rn <em>boost</em>::<em>shared_ptr</em> text = get( "test" ); rn print(text); rn rn[/code]rn[size=18px]为什么单步调试在main函数结尾时调用<em>shared_ptr</em><em>析构</em>函数这句代码走不下去了?[/size]rn[img=https://img-bbs.csdn.net/upload/201502/02/1422851602_261303.png][/img]rn[size=18px]程序运行完后也没得"按任意键继续"?[/size]
boost bind shared_ptr shared_from_this 问题 求解决
class A : public <em>boost</em>::enable_shared_from_this rnrn void fun1()rn rn <em>boost</em>::bind(&A::do,rn shared_from_this());rn ;rn void do()rn rn ;rn;rn想问下,bind类A的do函数,do函数的参数是const A* this;为什么bind的对应参数是shared_from_this()的rn返回值,是个<em>shared_ptr</em>,我看<em>shared_ptr</em>没有转化到const A*的转化啊,这个怎么解释呢?rnfun1函数内的功能可能没有写完,就是这个bind函数对应的参数不知道怎么解释。rn
请教一个shared_ptr问题
<em>shared_ptr</em>是怎么记住它起初得到的指针类型的?rn比如rnstruct B ;rn<em>shared_ptr</em> ptr(new B( ));rn也能正确执行,我只能看到它有一个成员模板构造函数,但是却找不到<em>析构</em>函数的源码,请各位高手指点一下那两行程序的运行机制,最好能详细说一下<em>shared_ptr</em>是怎么记住B的类型的,谢谢。
【c++】构造器与析构
初学c++,今天学到构造器与<em>析构</em>器,构造器可以对一个类的基本数据进行赋值,初始化数据和开辟新空间。
swift 析构
<em>析构</em>过程原理 swift会自动释放不需要的实例以释放资源,swift通过自动引用计数处理实例的内存管理。通常当你的实例被释放时不需要手动的去清理,但是,当使用自己的资源使,可能需要进行一些额外的清理。 <em>析构</em>器是在实例释放发生前被自动调用,不能主动调用<em>析构</em>器。子类继承了父类的<em>析构</em>器,并且在子类<em>析构</em>器实现的最后,父类的<em>析构</em>器会被自动调用。即使子类没有提供自己的<em>析构</em>器,父类的<em>析构</em>器也同样会被调用。
C++——构造器与析构
引入: 在使用Class时,得先自己初始化一段空间。 类外成员函数:void init(); 但是在有了构造器之后可用构造自动初始化一段空间。 Class Stack { Stack() //有参与无参定义 (默认值?) { Top = 0; Space = new char (1024); } //Void init ( ); // 用如上 Stack()构造器 取代 并且...
【C++】构造器和析构
构造器是类里一种特殊的方法 和普通方法的区别 —构造器的名字必须和所在类的名字一样 —系统会在创建某个类的实例是会在第一时间自动调用这个类 —构造器永远不会返回任何值 创建构造器,需要把它的声明先放到类里 构造对象数组 定义<em>析构</em>器 一个实例 #include #incl
05析构
这是一套全面而系统的C++学习教程: 1,C++对C的全面提高(类型增强,函数重载,默认参数,引用,new/delete 内联函数,类型强转,命名空间,系统string类。2,封装,类与对象,友元,运算符重载。 3,继承与派生,多态,UML,设计模式。4,文件IO流,模板,STL,异常机制。
Swift析构
Swift中的<em>析构</em>器的作用类似C++中的<em>析构</em>器,用deinit关键字,在实例被销毁之前被自动调用的,主要作用是释放一些资源,比如你之前打开了一个数据库,并写入一些数据,在类实例被释放之前需要关闭该数据库。 deinit{ //释放一些资源 } 注意: <em>析构</em>器只能在类(class)中使用...
构造器与析构
1.没有参数的构造器。 其它面向对象语言中,构造器名需要与类型名相同,而在Switch语言中,无论类型名是什么,构造器名都是init。 struct Fahrenheit{     var temperature:Double     init(){         temperature = 32.0     } } //创建Fahrenheit
swift语法 →析构
系统通过自动引用计数(ARC)来处理类实例的内存管理。系统会自动销毁不再需要的类实例已释放内存。因此,当实例类被销毁时通常不需要手动执行清理工作。 当使用自己创建的资源时,可能需要执行以下额外的清理工作, 例如创建了一个<em>自定义</em>的类来打开一个文件夹写入数据,可能需要在在类实例被销毁前关闭该文件。 系统为类实例被销毁之前会立即自动调用<em>析构</em>器,所以,可以在<em>析构</em>器中执行额外的清理工作。   <em>析构</em>器...
C++ 析构器,重载运算符
<em>析构</em>器:一个类对象需要作善后处理 相当于拆除楼房了,剩下的善后处理 什么时候来执行:当类对象被释放时候,系统会通知对象 ~类名()  不带形参,对象都已经释放了,传递值没有意义 1.只有一种<em>析构</em>器(不能重载) 2.默认添加<em>析构</em>函数(空函数体) 3.堆区必须由delete  来释放。  定义的是先全局,在动态   释放是先释放动态在全局 释放空间 动态数组:链表 , 函数结束后对象释放了,但是它的链...
C++之构造器和析构
1.构造器 (1)语法规则: class 类名 { 类名(形式参数) 构造体 } 在类对象创建时,自动调用,完成类对象的初始化。尤其是动态堆内存的申请。 规则: 1 在对象创建时自动调用,完成初始化相关工作。 2 无返回值,与类名同, 3 可以重载,可默认参数。 4 默认无参空体,一经实现,默认不复存在。     系统一般会提供一个默认的构造函数,我们可以不用管它,但是如果
类的析构器、文件写入
#include &amp;lt;iostream&amp;gt; #include &amp;lt;string&amp;gt; #include &amp;lt;fstream&amp;gt; //文件读写 using namespace std; class StoreQuote { public: string quote; string speaker; ofstream fileOut; //!!...
请教高手:如何从 boost::shared_ptr 转换为 T* 呢?
rn我是这样转的rn<em>boost</em>::<em>shared_ptr</em> sharePtr;rnT* ptr = &*sharePtr;rn这样转也成功了,不过我是试出来的,不知道其理论依据,也不知道会不会不稳定;rn请高手指点一二:
===请教智能指针shared_ptr的用法问题?===
请问:下面代码中智能指针的定义spi是怎么回事情??rn以前只用到std::tr1::<em>shared_ptr</em> v(strdup(pcParaValue));之类的定义,没有遇到两个参数的!!rnrn[code=c]rntemplaternclass CNotifyI // 清理者类,给<em>shared_ptr</em>用于自动释放占用的资源rnrnpublic:rn CNotifyI() : pt_(NULL) rn CNotifyI(T * pt) : pt_(pt) rn void setRef(T * pt) rn pt_ = pt;rn rn void operator()(int * pi) rn if (pt_ != NULL && pi != NULL && *pi >= 0)rn pt_->notify(pi);rn rnprivate:rn T * pt_;rn;rnrn CNotifyI dltr_;rn int i;rn ... rn std::tr1::<em>shared_ptr</em> spi(&i, dltr_);[/code]
boost::shared_ptr 实现了写同步吗?
请问熟悉<em>boost</em>的朋友,<em>boost</em>::<em>shared_ptr</em> 在两个线程同时写入时,是安全的吗?
boost::shared_ptr 引用循环中的临时变量
[code=c] for(int i = 0; i < 2; i ++)rn rn vector v;rn v.push_back(2);rn <em>boost</em>::<em>shared_ptr</em>> bsp(&v);rn [/code]rnrn<em>boost</em>::<em>shared_ptr</em> 引用循环中的临时变量会报错,个人觉得可能是对象在单个循环退出时被<em>析构</em>了两次。rn如果确实有在循环中使用智能指针的必要,问问大牛们有什么好的解决办法
boost shared_ptr 及C++内存管理的一些总结
先从实际<em>问题</em>开始讨论, 有个视频采集线程,采集到一帧视频数据, 这帧数据要给存储模块(线程)、RTSP模块,RTMP模块使用。 像这样的情况,内存的申请是在采集线程, 但释放就不能是在采集线程了,所以要实现,谁最后使用,谁释放。如图所示:   需求明确,但是代码怎么实现呢? 答案是用到智能指针实现! 智能指针又是怎么实现呢? 智能指针使用引用技术实现, 当指针传递时,引用加1,当指针使用
boostshared_ptr在linux下gcc 4.4.6编译报错解决办法
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/algorithmfwd.h:353:41: 错误:宏“max”传递了 3 个参数,但只需要 2 个 在包含自 /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/b
小和尚上山学习之智能指针(三)--boost::shared_ptr
<em>boost</em>::<em>shared_ptr</em> 属于 <em>boost</em> 库,定义在 namespace <em>boost</em> 中,包含头文件 #include&amp;lt;<em>boost</em>/smart_ptr.hpp&amp;gt; 便可以使用。在上面我们看到 <em>boost</em>::scoped_ptr 独享所有权,不允许赋值、拷贝,<em>boost</em>::<em>shared_ptr</em> 是专门用于共享所有权的,由于要共享所有权,其在内部使用了引用计数。<em>boost</em>::sh...
关于boost::shared_ptr只能指针的转换
先描述一下背景:rnrnView的构造函数1:(在做操作一的时候调用构造函数1)rnrnView::View(Doc& rDocument, Window *pWindow,const SwViewOption *pNewOpt, OutputDevice *pOutput,long nFlags )rnrnpLayout( 0 )在这里初始化,pLayout( 0 )为View的成员,类型为 Frame *pLayout(Frame为另外一个类)rnrnvoid View::Init( const ViewOption *pNewOpt )rn在此函数中对pLayout进行new操作rnpLayout = new Frame( pDoc->GetDfltFrmFmt(), this );rn操作完成后,文档中的这个View就有了它的pLayout。rnrnrnView的构造函数2:(在做操作二的时候调用构造函数2)rnrnView::View( View& rShell, Window *pWindow,rn OutputDevice *pOutput, long nFlags ) :rnrnrn此时的pLayout为0;初始化,又构造一个View(这个View是做了操作二后产生的临时的View)rnvoid View::Init( const SwViewOption *pNewOpt )rn在此函数中对pLayout进行new操作rnpLayout = new Frame( pDoc->GetDfltFrmFmt(), this );rn操作完成后,文档中的这个临时的View就有了它的pLayout。rnrn执行操作三:<em>析构</em>rn<em>析构</em>的时候:rnrnView::~View()rn在<em>析构</em>里执行delete pLayout; <em>析构</em>了它自己的pLayoutrnrn<em>问题</em>是:对于pLayout = new Frame( pDoc->GetDfltFrmFmt(), this );这个语句,产生的pLayout 是同一个pLayout ,也就是说,对于一个View和一个临时的View来说,两个pLayout 是一样的。因此,现在要使用<em>boost</em>::<em>shared_ptr</em>这种智能指针来转换这个pLayout ,使其变成一个共享的引用指针来指向同一个pLayout 而避免初始化出两个一样的pLayout 。rnrn各位大侠,小弟看了不少<em>boost</em>::<em>shared_ptr</em>的相关文章,可惜没学会怎么用。请指点啊rn
boostshared_ptr在linux下gcc 4.4.5编不过去?
<em>boost</em>的<em>shared_ptr</em>在linux下gcc 4.4.5编不过去?rnrn报奇怪的错误,说C++库头文件参数不一致??rn<em>boost</em>版本1.46 关键就是报头文件有<em>问题</em>根本没到代码上rnrn//////////////////////////////////////////////////错误1/////////////////////////////////////////////////////rn/usr/lib/gcc/i686-redhat-linux/4.4.5/../../../../include/c++/4.4.5/bits/algorithmfwd.h:353:41: 错误:宏“max”传递了 3 个参数,但只需要 2 个rn/usr/lib/gcc/i686-redhat-linux/4.4.5/../../../../include/c++/4.4.5/bits/algorithmfwd.h:364:41: 错误:宏“min”传递了 3 个参数,但只需要 2 个rnIn file included from /usr/lib/gcc/i686-redhat-linux/4.4.5/../../../../include/c++/4.4.5/bits/stl_algo.h:61,rn from /usr/lib/gcc/i686-redhat-linux/4.4.5/../../../../include/c++/4.4.5/algorithm:62,rn from /mnt/hgfs/tmp/workspace/LwdpGit/Lwdp/code/h/LwApiLib/ComLib/<em>boost</em>/smart_ptr/<em>shared_ptr</em>.hpp:41,rn from /mnt/hgfs/tmp/workspace/LwdpGit/Lwdp/code/h/LwApiLib/ComLib/<em>boost</em>/<em>shared_ptr</em>.hpp:17rnrnrn//////////////////////////////////////////////////错误2/////////////////////////////////////////////////////rnrn/usr/lib/gcc/i686-redhat-linux/4.4.5/../../../../include/c++/4.4.5/bits/algorithmfwd.h:349: 错误:expected unqualified-id before ‘const’rn/usr/lib/gcc/i686-redhat-linux/4.4.5/../../../../include/c++/4.4.5/bits/algorithmfwd.h:349: 错误:expected ‘)’ before ‘const’rn/usr/lib/gcc/i686-redhat-linux/4.4.5/../../../../include/c++/4.4.5/bits/algorithmfwd.h:349: 错误:expected ‘)’ before ‘const’rn/usr/lib/gcc/i686-redhat-linux/4.4.5/../../../../include/c++/4.4.5/bits/algorithmfwd.h:349: 错误:expected initializer before ‘const’rn/usr/lib/gcc/i686-redhat-linux/4.4.5/../../../../include/c++/4.4.5/bits/algorithmfwd.h:353: 错误:‘const _Tp& std::max’声明为模板rn/usr/lib/gcc/i686-redhat-linux/4.4.5/../../../../include/c++/4.4.5/bits/algorithmfwd.h:360: 错误:expected unqualified-id before ‘const’rn/usr/lib/gcc/i686-redhat-linux/4.4.5/../../../../include/c++/4.4.5/bits/algorithmfwd.h:360: 错误:expected ‘)’ before ‘const’rn/usr/lib/gcc/i686-redhat-linux/4.4.5/../../../../include/c++/4.4.5/bits/algorithmfwd.h:360: 错误:expected ‘)’ before ‘const’rn/usr/lib/gcc/i686-redhat-linux/4.4.5/../../../../include/c++/4.4.5/bits/algorithmfwd.h:360: 错误:expected initializer before ‘const’rn/usr/lib/gcc/i686-redhat-linux/4.4.5/../../../../include/c++/4.4.5/bits/algorithmfwd.h:364: 错误:‘const _Tp& std::min’声明为模板rnIn file included from /usr/lib/gcc/i686-redhat-linux/4.4.5/../../../../include/c++/4.4.5/algorithm:62,rn from /mnt/hgfs/tmp/workspace/LwdpGit/Lwdp/code/h/LwApiLib/ComLib/<em>boost</em>/smart_ptr/<em>shared_ptr</em>.hpp:41,rn from /mnt/hgfs/tmp/workspace/LwdpGit/Lwdp/code/h/LwApiLib/ComLib/<em>boost</em>/<em>shared_ptr</em>.hpp:17,
boost::shared_ptr 的作为参数传递,以及构造细节!
代码如下: #include #include #include void funcx(<em>boost</em>::<em>shared_ptr</em> c, int b) { std::cout << "after: " (&c) << ", " (c.get()) << ", " (&b) << std::endl; } int main(int argc, char *argv) { int
关于boost::shared_ptr 智能指针小例子
<em>boost</em>::<em>shared_ptr</em> 智能指针 可以共享所有权的只能指针,看如下小例子 #include &amp;lt;iostream&amp;gt; #include &quot;<em>boost</em>/<em>shared_ptr</em>.hpp&quot; #include &amp;lt;string&amp;gt; using namespace std; //定义一个结构体,表示是否有人在家 struct SomeOneAtHome{ SomeO...
boost::shared_ptr 智能指针在项目中的使用
0x01 智能指针的设计的目的       在linux c/c++编程过程中,对资源的合理使用是一个常遇到的题,如何防止内存泄露是c/c++程序员必须关注的<em>问题</em>。如何规避内存泄露,那就必须要有良好的编程习惯,malloc/free,new/delete需成对出现等。       C++编程中为了防止内存的泄露,<em>boost</em>设计了智能指针,目的消除未delete时的内存泄露。 0x02 智能指
请问boost::shared_ptr的reset()方法功能是什么?
请问<em>boost</em>::<em>shared_ptr</em>的reset()方法功能是什么?rn谢谢!
shared_ptrshared_ptr 之间相互转换问题
如何做,才能使得share_ptr保存的父类和子类之间相互转换,又不影响<em>shared_ptr</em>的使用计数。
BOOST object_pool自定义类模板问题
c<em>boost</em>pool.hrnrn#include rn#include rntemplate rnclass BOOSTPOOLrnpublic:rn <em>boost</em>::object_pool _objpool;rn void* operator new( size_t size )rn rnrn return _objpool.construct();rn rnrn void operator delete( void* p )rn rn _objpool.destroy(p);rn rnrn;rnrn-------------------------------------------rnrnUser.hrnrn#pragma oncern#include "c<em>boost</em>pool.h"rnclass CUser:public BOOSTPOOLrnrnpublic:rn CUser(void);rn ~CUser(void);rn;rnrn--------------------------------------------rnrnccc.cpprnrnrn#include "stdafx.h"rn#include "User.h"rnrnint _tmain(int argc, _TCHAR* argv[])rnrn CUser *p=new CUser();rn return 0;rnrnrnrn编译总是出错:rn1>ccc.cpprn1>e:\<em>boost</em>test\ccc\ccc\c<em>boost</em>pool.h(10) : error C2228: “.construct”的左边必须有类/结构/联合rn1> e:\<em>boost</em>test\ccc\ccc\c<em>boost</em>pool.h(8): 编译类 模板 成员函数“void *BOOSTPOOL::operator new(size_t)”时rn1> withrn1> [rn1> T=CUserrn1> ]rn1> e:\<em>boost</em>test\ccc\ccc\user.h(4): 参见对正在编译的类 模板 实例化“BOOSTPOOL”的引用rn1> withrn1> [rn1> T=CUserrn1> ]rn1>生成日志保存在“file://e:\<em>boost</em>test\ccc\ccc\Debug\BuildLog.htm”rn1>ccc - 1 个错误,0 个警告rn========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========rnrnrnrn请高手指点
boost问题请教boost
rn std::vector m_lsbufferQueue;rnrn BOOST_FOREACH(BOOST_TYPEOF(m_lsbufferQueue)::reference buf, m_lsbufferQueue)rn rn size_t size = m_pmp3dataSource->Read(&data[0], data.size());rn if (size == -1)rn Stop();rn elsern data.resize(size);rn if (!data.empty())rn rn ++ non_empty_buf;rn alBufferData(buf, format, &data[0],rn static_cast(data.size()), m_pmp3dataSource->Freq());rn rn elsern rn break;rn rn rnrn这段代码的意识就是像缓冲区中填充数据,我的需求就是把BOOST_FOREACH(BOOST_TYPEOF(m_lsbufferQueue)::reference buf, m_lsbufferQueue) 改成stl的,不用<em>boost</em>,<em>请教</em>大虾,这个怎么改?rnrnBOOST_FOREACH BOOST_TYPEOF(m_lsbufferQueue)::reference 是啥意识?<em>请教</em>了,请讲清楚一点,谢谢!
请教 boost: serialization问题
学习一个小时,能将简单的类进行序列化。rnrn我的<em>问题</em>是:rnrn1: 项目中有很多.cpp 和.h文件, 怎么将里面的类、member 都序列化?rnrnrn2: 这些文件需要先zlib处理下, 但是从void serialize( class &, ....)里要看不到任何 zlib的,我该怎么设计,用哪种设rnrn计模式?rnrn3. 大牛要是有相关代码能参考下就好了,3q.
请教boost的消息队列问题
例如,有msg1=“0x01,0x02,0x03,0x04”,msg2="0x05,0x06"这样两条消息,[color=#FF0000]线程1[/color]先将[color=#0000FF]msg1[/color]存入队列,再存[color=#0000FF]msg2[/color],[color=#FF0000]线程2[/color]取出的时候,只要确定取的是4个字节,就能保证取出的是消息[color=#0000FF]msg1[/color]吗?rn有没有这方面的例子,参考下。
boost下载器
<em>boost</em>下载工具
swift学习记录(析构器)
<em>析构</em>器只适用于类类型,当一个类的实例被释放之前,<em>析构</em>器会被立即调用。<em>析构</em>器用关键字deinit 来标示。在类中,每个类只能有一个<em>析构</em>器。 基本语法deinit{ //执行<em>析构</em>过程 }<em>析构</em>过程原理 swift 通过自动引用计数(ARC)来管理内存,会自动释放不在需要的类来释放资源。通常实例被释放时不需要手动去释放资源。但当使用自己的资源时 需要进行一些额外的清理。例如,如
C++析构器的简单疑问
小白一枚,写了一个很简单的构造器函数,但是一直有<em>问题</em>,提示是堆中断rnsstring.hrn[code=c]#pragma oncernusing namespace std;rnclass sstringrnrnpublic:rn sstring(const char* str);rn ~sstring();rn char* c_str(void);rnprivate:rn char* _str;rn;rn[/code]rnsstring.crn[code=c]#include "sstring.h"rn#includernrnsstring::sstring(const char* str)rnrn _str = new char(strlen(str)+1);rn strcpy(_str, str);rnrnchar* sstring::c_str(void)rnrn return _str;rnrnsstring::~sstring()rnrn delete[] _str;rnrn[/code]rnmain.crn[code=c]#include rn#include rn#include rn#include "sstring.h"rnusing namespace std;rnrnint main()rnrn sstring str2("China");rn cout << str2.c_str() << endl;rn return 0;rn[/code]rn结果是[img=https://img-bbs.csdn.net/upload/201611/02/1478078558_572733.png][/img]rn最后把<em>析构</em>器里的delete[] _str 注释掉才能正常,不会崩溃rn求原因!
C++类之构造器和析构
虽然平时我们都叫构造函数和<em>析构</em>函数,但他们并不像真正的函数一样,不管是构造还是<em>析构</em>两个都没有返回值,所以最好称他们为构造器和<em>析构</em>器。基础就不说了,下面分别说一下这两个东西中容易被忽视的东西:一、构造器 1.我们知道构造器若没有定义,编译器会自动生成一个默认无参的构造器,一旦<em>自定义</em>了构造器,那么就不再会有自动生成,一般情况下最好<em>自定义</em>中带有无参的构造器,不然bug是不可避免的,建议是定义带默认参数的
swift中析构器例子
class Shape { var numberOfSides: Int = 0 let numberOfPoint = 3 var name:String init(name:String) { self.name = name print(&quot;init called&quot;) } deinit { prin...
Swift基础 自动引用计数和析构
当每次创建新实例时,ARC会分配一块内存,用于储存实例信息。当实例不再使用时,ARC便会释放实例所占用的内存。引用计数那怎么判断实例是否还在使用?在Swift中,ARC会跟踪和计算实例正在被多少个变量或常量所引用,只要还有一个变量或常量保持实例的“强引用”,那么就说实例还在使用中,不能释放其内存。一旦计算实例不再使用,便会调用实例的<em>析构</em>函数“deinit”class Person { var
C++——继承 构造器和析构
#include&quot;iostream&quot; #include&quot;string&quot; using namespace std; class Animal { protected: string name; public: Animal(string thename){name=thename;cout&amp;lt;&amp;lt;name&amp;lt;&amp;lt;endl;} void eat(){cout&amp;...
5 初始化器和析构
初始化器和<em>析构</em>器介绍。
C++之派生类的构造器与析构
一、派生类的构造顺序与<em>析构</em>顺序派生类的构造顺序: 父类-成员对象-子类本身<em>析构</em>类的构造顺序(与构造顺序正好相反): 子类本身-成员对象-父类二、<em>析构</em>说明<em>析构</em>器不像构造器,派生类的构造器中要调用父类的构造器来初始化对象,那么如何来释放对象空间呢,派生类<em>析构</em>器不需要调用父类的<em>析构</em>器,个人<em>析构</em>个人的,谁生成的空间就由谁去释放,相互不干扰。
Swift学习-析构器(十五)
<em>析构</em>器,释放内存做清理工作。
模板自身友元的问题(模仿BOOST的shared_ptr时碰到)?
以下是中的部分代码:rnrntemplate class <em>shared_ptr</em>rnrn ... ...(省略)rnrn// Tasteless as this may seem, making all members public allows member templatesrn// to work in the absence of member template friends. (Matthew Langston)rnrn#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDSrnprivate:rn template friend class <em>shared_ptr</em>;rn template friend class weak_ptr;rn#endifrn; // <em>shared_ptr</em>rn(VC6.0成功编译通过)rnrn而我写的时候template friend class <em>shared_ptr</em>;却在那行报错。rn出现rnerror C2059: syntax error : ''rn see reference to class template instantiation '<em>shared_ptr</em>' being compiledrnerror C2143: syntax error : missing ';' before ''rn see reference to class template instantiation '<em>shared_ptr</em>' being compiledrnerror C2238: unexpected token(s) preceding ';'rn see reference to class template instantiation '<em>shared_ptr</em>' being compiledrn... ...rn去掉template friend class <em>shared_ptr</em>;正常。但是我要派生类的智能指针模板内部可以访问其父类的私有成员。就是<em>shared_ptr</em>内部访问<em>shared_ptr</em>的私有成员(不用get,就用friend class)。rnrn但是可以,我写的却编译不过.那位大侠99.rnrnrnrn
QT自定义控件用boost::shared_ptr之后设置样式表无效的问题
我的外部有一个widget窗口,上面有一两百个<em>自定义</em>的MineButton控件,我的想法是在MineButton里面实现点击就向widget发送信号的功能,让widget知道是哪一个被点击了,然后进行相关的操作。rnrn首先我在QT<em>自定义</em>了一个控件MineButton,其实就是一个PushButton,然后头文件大概是这样(只写了出<em>问题</em>的相关部分)rn[code=c]class MineButtonrnrnpublic:rn void ConnectClickedSignal(<em>boost</em>::function)> slot);rnprivate:rn void on_MineButton_clicked();rnpublic:rn <em>boost</em>::signal2::signal)> m_clicked_signalrn[/code]rnrnConnectClickedSignal函数实现就是简单的信号连接操作:rn[code=c]void MineButton::ConnectClickedSignal(<em>boost</em>::function)>)rnrn m_clicked_signal.connect(slot);rn[/code]rnrn然后在MineButton这个控件被点击触发的槽函数中,我进行了如下操作,试图把这个MineButton传出去,结果发现上面设置的样式表无效了:rn[code=c]void MineButton::on_MineButton_clicked()rnrn ui->MineButton->setStyleSheet("QPushButtonborder-image: url(:/background.jpg);")rn <em>boost</em>::<em>shared_ptr</em> btn_ptr = <em>boost</em>::share_ptr(this);rn m_clicked_signal(btn_ptr);rn[/code]rnrn然而像下面这样不用<em>boost</em>::<em>shared_ptr</em>,就用普通指针的时候,样式表设置正常,没有<em>问题</em>:rn[code=c]void MineButton::on_MineButton_clicked()rnrn ui->MineButton->setStyleSheet("QPushButtonborder-image: url(:/background.jpg);")rn MineButton* btn_ptr = this;rn m_clicked_signal(btn_ptr);rn[/code]rnrn请问这是为什么呢,有没有大神知道这是什么原因导致的?
boost 的list_of 为什么多了个析构?
[code=c]rnrnclass Arnrnpublic:rn A ( int x ) : a(x)rn rn cout << "A" << endl;rn rn virtual ~A ( void )rn rn cout << "~A" << endl;rn rn int a;rn;rn rnint main() rn rn A x1(1);rn A x2(2);rn vector a ( cref_list_of(x1)(x2) ); rn rn return 0;rn rn[/code]rnrn输出:rnArnArn~Arn~Arn~Arn~Arn~Arn~Arn请按任意键继续. . .rnrnrn多走了4个<em>析构</em>?
shared_ptr
如果循环引用怎么办???
boost log自定义sink
我<em>自定义</em>了已个backend:rnclass MyBackend :rn public sinks::basic_sink_backend< sinks::concurrent_feeding >rnrnpublic:rn // The function is called for every log record to be written to logrn void consume(logging::record_view const& rec);rn;rnrn在consume函数我如何获取到当前调用的日志级别?请熟悉的大神帮我解答一下。
boostshared_ptr与std::tr1::shared_ptr冲突问题
我的开发环境是VS2010,BOOST 1.57,在使用BOOST智能指针<em>boost</em>::<em>shared_ptr</em>的shared_from_this()函数时,编译报错。错误信息是:error C2440: “初始化”: 无法从“std::tr1::<em>shared_ptr</em>”转换为“<em>boost</em>::<em>shared_ptr</em>”。rn 代码如下:rn[code=c] class self_shared : public enable_shared_from_thisrn rn public:rn self_shared(int n) : x(n) rn int x;rn void print()rn rn cout<< sp = <em>boost</em>::make_shared(512);rn sp->print();rn <em>boost</em>::<em>shared_ptr</em> p = sp->shared_from_this();rn p->x = 1000;rn p->print();[/code]rn 看报错信息是编译时,在<em>boost</em>::<em>shared_ptr</em> p = sp->shared_from_this();这行,应该使用<em>boost</em>::<em>shared_ptr</em>::shared_from_this()函数的,但是编译时用了std::tr1::<em>shared_ptr</em>导致的,但是要怎么解决呢?
浅谈shared_ptrshared_ptr涉及到的循环引用问题
起初在C++标准库里面是没有智能指针的,直到C++11才加入了<em>shared_ptr</em>和unique_ptr以及weak_ptr。 最早的智能指针在Boost库里面,Boost库是为C++标准库提供扩展的一些C++程序的总称,由Boost社区组织开发维护。   <em>shared_ptr</em>与scoped_ptr一样包装了new操作符在堆上分配的动态对象,但它实现的是引用计数型的智能指针 ,可以
请教一个shared_ptr重复定义的问题
std::<em>shared_ptr</em> 和<em>boost</em>::<em>shared_ptr</em> 冲突,rn最初想通过给所有<em>shared_ptr</em>加<em>boost</em>前缀,rn可是尼玛越改越多,数量巨大。还有涉及到其他人的模块。我不敢乱动。rn有没有什么好点的解决办法。用的是vs2012.rn最后吐槽下那些有事没事在头文件里using namespace的人,伤不起。[img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/41.gif][/img]
自定义的STL空间配置器 析构出错
以下是参照网上实例改写的一个简易空间配置器,该配置器初始时一次性分配内存,在最后程序结束时才释放全部内存,以提高效率,以下我的代码:rnrn[code=c]rnconst int MAX_COUNT = 100000;rnrntemplaternclass Allocatorrnrnpublic:rn //配置器内部型别rn typedef _Ty value_type;rn typedef typename std::size_t size_type;rn typedef typename std::ptrdiff_t difference_type;rn typedef _Ty* pointer;rn typedef const _Ty* const_pointer;rn typedef _Ty& reference;rn typedef const _Ty& const_reference;rnrn //配置器型别转换rn templatern struct rebindrn rn typedef Allocator other;rn ;rnrnrn //默认构造函数rn Allocator()rn pBuf = (pointer)(::operator new(MAX_COUNT * sizeof(_Ty)) );rn pNow = pBuf;rn rn //默认复制构造 rn Allocator(const Allocator &)rn pBuf = (pointer)(::operator new(MAX_COUNT * sizeof(_Ty)) );rn pNow = pBuf;rn rn //不同配置器的复制构造rn templatern Allocator(const Allocator &)rn pBuf = (pointer)(::operator new(MAX_COUNT * sizeof(_Ty)) );rn pNow = pBuf;rn rnrn //<em>析构</em>函数rn ~Allocator()throw() rn ::operator delete(pBuf);rn rnrnrn //分配未构造的内存待用rn pointer allocate(size_type num)rn rn pointer pTmp = pNow;rn pNow += num;rn return pNow;rn rn //在内存中构造对象rn void construct(pointer p,const_reference value)rn rn new(p) _Ty(value);rn rn //<em>析构</em>内存中的对象rn void destroy(pointer p)rn rn p->~_Ty();rn rnrn void deallocate( pointer p, size_type size )rn rn rnrnrnprivate:rn pointer pBuf;rn pointer pNow;rn;rnrnrnrnint main()rnrn std::vector > aa;rn aa.push_back(444);rn return 0;rnrn[/code]rnrnrn该代码删除<em>析构</em>函数中的那一句就能正确执行,但加上就出错了,求解释
spring之 自定义Bean初始化和析构
springIOC 容易负责管理Bean的生命周期,允许你在它们的生命期特定时点执行<em>自定义</em>任务,你的任务应该封装在回调方法中,由spring IoC容器在核实的时候调用  下面的列表展示了SpringIoC容器管理Bean周期的步骤  ① 构造程序或者工厂方法创建Bean实例  ② 向Bean属性设置值和Bean引用  ③ 调用初始化回调方法  ④ Bean就绪  ⑤ 容器关闭时,调用
请教!临时对象析构失败
编一个C++程序的时候,遇到了如下<em>问题</em>,请指教rnrn#include rn#include rnrnusing namespace std;rnrnclass str //这是一个简单的字符串类rnrn char *p;rn size_t len;rn str(size_t l) p=new char[(len=l)+1]; cout << (void *)p << " Allocated (size_t)\n"; rnpublic:rn str() p=new char[1]; p[len=0]=0; ;rn str(const char *src) rn p=new char[(len=strlen(src))+1]; strcpy(p, src); rn cout << (void *)p << " Allocated (const char*)\n"; // 这些输出语句都是跟踪运行过程的rn rn str(const str &src) rn p=new char[(len=src.len)]; rn strcpy(p, src.p); rn cout << (void *)p << " Allocated (const str&)\n"; rn rn str operator=(const str& src) rn rn delete[] p; rn p=new char[(len=src.len)]; rn strcpy(p, src.p); rn return *this; rn rn str operator+(const str& src) rn rn str ret(len+src.len); // [1]rn strcpy(ret.p, p); strcpy(ret.p+len, src.p);rn return ret; // [2]rn rn ~str() rn cout << "Deallocating " << (void*)p << "...";rn delete[] p;rn cout << " Succeeded\n";rn rn rn;rnrnmain()rnrn str s("Ok"); //[3]rn s+s; // [4]rn cout << s.makestr() << endl;rnrnrn执行结果:rnrn00342490 Allocated (const char*) //这是执行[3]时构造函数为字符指针分配的内存rn003426D0 Allocated (size_t) //这是执行[3]时构造函数为字符指针分配的内存rn00342718 Allocated (const str&) //这是执行[3]时构造函数(copy constructor)为指针分配的内存rnDeallocating 003426D0... Succeeded //[1]处分配的内存在退出函数operator+时成功地被释放rnDeallocating 00342718... //[4]处产生的临时str对象的正在<em>析构</em>rnrn然后就弹出一个错误对话框: rnDebug Error!rnDAMAGE: after Normal Block(#??) at 0x????????rnrn请问这是为什么?rn
请教boost::spirit的parse()问题
刚开始看spirit,有一个疑问,一个字符串匹配成功后如何来执行一点动作,比如:rnconst char* szParam = "If(1)";rnrule<> rlx, rlAct, rlStr;rnrlx = digit_p;rnrlStr = str_p("If(")>>rlx>>ch_p(')');rnrnparse_info<> r = parse( szParam, rlStr);rnrn我的本意是要提取出If(1)里面的1,然后执行一个函数fun,请问该如何做?或者说怎么拿到那个1?
请教boost线程一个问题
刚学习<em>boost</em>rnrn使用<em>boost</em>来开发tcp的serverrnrn程序accept为一个线程rnrn当接受到一个客户端socket链接时,需要为该客户端创建一个线程来单独处理该链接rnrn该链接或许链接会长时间保持链接状态rnrn这样的情况下我该怎么使用<em>boost</em>::thread来建立于客户端的链接rnrn谢谢rnrnrnint main()rnrn <em>boost</em>::thread accpetthrd(acceptfun); //这里创建了一个服务线程rn accpetthrd.join();rnrnrnrnvoid acceptfunrnrn while(1)rn rn SOCKET sClient=accept(s,(struct sockaddr*)&from,&fromlen); rn //这里接受到一个新的链接;rn //我的意思是希望能够在这里创建一个线程,类似windows上的rn //线程 DWORD WINAPI Thread_client(LPVOID pParam)rn //如何使用<em>boost</em>::thread来表示上述方式?多谢rn rnrnrnvoid Thread_oneclient(socket& s)rnrn //recv and send ;rn
请教boost正则表达式的语法问题
我要提取一串URL 格式如下:rnhttp://***.***.***user_login_qp.php?uid=%BF%BC%C0%AD&pwd=7faac35ae7dcaddca9ef0c1b1c50e68a&flag=Testrn要提取uid pwd flag 3个字段 <em>请教</em>一下各位大牛语法 能解释一下各字段的提取方法则更好,刚看<em>boost</em>伤不起...rn
请教构造析构与虚函数
为什么构造函数可以是虚函数,而<em>析构</em>函数不可以呢?
请教:为什么析构了三次
[code=C/C++]class Arnpublic:rn A()cout<<
请教下Shared_ptr reset()是否一定会调用到析构
<em>shared_ptr</em> p(new A);rnp.reset();rnreset()貌似是生成一个临时匿名的<em>shared_ptr</em>来交换指针所有权,调用之后应该会执行A的<em>析构</em>,写了个demo确实是这样,但在项目中有时候又不会执行到<em>析构</em>,reset后<em>shared_ptr</em>确实是个空对象,请大神指点下。
请教一个Boost signal2 的问题
<em>问题</em>代码如下rn[code=C/C++]rn#include rn#include rn#include rnrnstruct Hellornrn void operator()() constrn rn std::cout << "Hello";rn rn;rnrnstruct Worldrnrn void operator()() constrn rn std::cout << ", World!" << std::endl;rn rn;rnrn//[ good_morning_def_code_snippetrnstruct GoodMorningrnrn void operator()() constrn rn std::cout << "... and good morning!" << std::endl;rn rn;rn//]rnrnint main()rnrnrn <em>boost</em>::signals2::signal sig;rnrn <em>boost</em>::signals2::connection c1 = sig.connect(1, World()); // connect with group 1rn <em>boost</em>::signals2::connection c2 = sig.connect( 0,Hello()); // connect with group 0rnrn sig.connect(GoodMorning());rnrn sig();rn sig.disconnect(&Hello::operator());//这里的slot_fun该怎么写?rn //sig.disconnect(0); //这样是ok的,但是不能具体指定group里面的某个slot函数rn //c2.disconnect();//这样也是ok的rn sig();rnrn return 0;rnrn[/code]rn我这样写了后:rn sig.disconnect(&Hello::operator());//这里的slot_fun该怎么写?rn没有任何效果。。。。rnrn虽然下面这两种写法都是满足要求的:rn //sig.disconnect(0); //这样是ok的,但是不能具体指定group里面的某个slot函数rn //c2.disconnect();//这样也是ok的rnrn但是,我想直接指定disconnect 某个group里面的slot_fun,该怎么写呢?rn sig.disconnect([color=#FF0000]这里面怎么写呢?[/color]);
请教boost::asio连接超时的问题
<em>boost</em>::asio要设置连接超时(是同步连接connect,不是async_connect),除了用deadline_timer::async_wait之外,还有没有其它方法?rn我要把连接和超时写在同一个函数里处理,而deadline_timer::async_wait需要另外写一个回调函数,很不爽。
请教使用boost/lexical_cast的问题
想在一个console application中使用<em>boost</em>/lexical_cast将字符串转换为数值的功能,rnVC6中设置了include路径,源码如下:rnrn#include "stdafx.h"rn#include rn#include rnrnusing namespace std;rnrnint main(int argc, char *argv[])rnrn using <em>boost</em>::lexical_cast;rn int a = lexical_cast("123");rn double b = lexical_cast("123.12");rnrn cout << a << endl;rn cout << b << endl;rn rn return 0;rnrnrn编译出错:rnerror C2062: type 'int' unexpectedrnerror C2062: type 'double' unexpectedrnrn请问如何解决?多谢!!!
关于boost::unorder_map析构后内存不释放的问题
现在遇到一个比较头疼的<em>问题</em>:rnrn类似于这样的一个hash_map:rntypedef <em>boost</em>::unordered_map hashmap_str;rnrnhashmap_str* pMap = new hashmap_str();rnrnrn不停地插入数据一万次以后,程序消耗了几百M内存,现在想把这些数据写入到数据库中, 然后rndelete pMap;rnrn结果发现程序占用内存并没有下降。rnrn因为插入数据可能会一直持续不断,等到程序消耗了1.3G内存左右时就会崩溃。rnrn所以请<em>请教</em>一下高手,这种<em>问题</em>如何解决?rnrn网上查了一下,有人说是默认allocator不释放内存, 那么用哪种allocator才能把内存释放给操作系统?rnrn先谢了。 rnrnrn
析构问题
using System;rnclass Arnrn public A()rn rn Console.WriteLine("类A被创建");rn rn ~A()rn rn Console.WriteLine("类A被<em>析构</em>");rn rnrnclass Testrnrn static void Main()rn rn new A();rn Console.ReadKey();rn rnrnrnrnrn打印出的结果 只显示构造A 为什么不显示~A里的内容 rn我看视频教程的时候 老师的编译器是能打印出~A的内容的 代码我是比着老师的敲的
基于dsp掌纹识别方法下载
本资源是西安电子科技大学硕士生做的论文,希望可以帮助大家! 相关下载链接:[url=//download.csdn.net/download/forever5296/3288108?utm_source=bbsseo]//download.csdn.net/download/forever5296/3288108?utm_source=bbsseo[/url]
Syncro.SVN.Client.v8.1.MacOSX破解版下载
Syncro SVN Client 8.1 for mac os,内涵破解方法。 在Mac OS系统中作为SVN客户端,比smartsvn好用的多,而且更符合在windows上使用svn的习惯。强烈推荐。 解压后有两个文件夹:syncroSVNClient(程序) crack(破解文件,按照install.txt操作即可) 相关下载链接:[url=//download.csdn.net/download/l241002209/6347005?utm_source=bbsseo]//download.csdn.net/download/l241002209/6347005?utm_source=bbsseo[/url]
人脸识别的专业SDK开发包4.0含注册#03下载
For C, JAVA, DELPHI, VB6 档案太大所以必须分三个下载,再合并档案。 相关下载链接:[url=//download.csdn.net/download/airfox7412/6854523?utm_source=bbsseo]//download.csdn.net/download/airfox7412/6854523?utm_source=bbsseo[/url]
相关热词 c++和c#哪个就业率高 c# 批量动态创建控件 c# 模块和程序集的区别 c# gmap 截图 c# 验证码图片生成类 c# 再次尝试 连接失败 c#开发编写规范 c# 压缩图片好麻烦 c#计算数组中的平均值 c#获取路由参数
我们是很有底线的