我在这个项目上工作,
我遇到的问题是,当我需要它时,它并没有真正被删除,因为它有一些指向它的共享指针.
我该如何解决这个问题,请帮忙.
我有以下代码:
#include <memory>
class Foo;
typedef std::tr1::shared_ptr<Foo> pFoo_t;
class DoSomething
{
public:
static void doSomething( pFoo_t p) { printf( "doing something...\n"); }
static void doSomethingElse( pFoo_t p) { printf( "doing something else...\n"); }
};
class Foo
{
public:
Foo() { printf( "foo()\n"); }
~Foo() { printf( "~foo()\n"); }
public:
void doSomething() { DoSomething::doSomething(pFoo_t(this)); }
void doSomethingElse() { DoSomething::doSomethingElse(pFoo_t(this)); }
};
int _tmain(int argc, _TCHAR* argv[])
{
Foo foo;
foo.doSomething();
foo.doSomethingElse();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我开始这个样本,然后我得到下一个断言:_BLOCK_TYPE_IS_VALID(pHead-> nBloakUse).
我怎么能避免这个?
我使用以下代码来解决此问题:
class Foo;
typedef …Run Code Online (Sandbox Code Playgroud) 这可能会推广到任何模板化的类,但我用shared_ptr遇到了这个问题.我有类系统,如:
class A {
protected:
// some data
}
class B : public A {
// some access functions
}
class C : public A {
// some other access functions
}
Run Code Online (Sandbox Code Playgroud)
我正在使用这个概念,因为在我的库中我使用的是不应该向用户公开的函数集,所以我将这些函数分成两个接口类.现在,我知道我可以使用一个班级和朋友,但如果需要多个班级来访问这些功能,这会变得很难看.
但是,我有问题,那些类是通过arround传递的shared_ptr,我需要保留引用计数(因为数据会被破坏).因此,我需要在此示例中转换shared_ptr<B>为shared_ptr<C>反之亦然.shared_ptr如果提供了所需的功能,是否允许这样的事情,如果有,那是什么?构造函数?分配运营商?或者我是否需要更高级别并投射整个指针而不仅仅是内容?到目前为止我没有运气.
是的,如果你有一个更好/更整洁的隐藏某些功能的方法,我会很高兴听到它,但我也想回答这个问题.
使用任何一个boost::scoped_ptr或boost::shared_ptr我得到错误
1> *\algomanager.cpp(28):错误C2064:term不计算为带1个参数的函数
我有这样的代码...
class X{
boost::shared_ptr<cPreFilterProcess> preProcess;
public:
X(){
preProcess(new cPreFilterProcess(pars));
}
};
Run Code Online (Sandbox Code Playgroud)
我错过了什么?谢谢.
我不知道为什么我不能在网上找到这个地方,但我怎么能访问class instance member variables通过shared_ptr?我试着在下面的代码中注释掉的方式.他们都导致了segmentation fault.
我假设我可以通过raw pointer从中获取成员变量来访问成员变量,shared_ptr但我宁愿避免因为它不干净而否定了shared_ptr什么是访问这些成员变量的安全方法的价值?
#include <memory>
#include <iostream>
class Test{
public:
int x;
Test() : x(5){}
};
int main()
{
std::shared_ptr<Test> f;
// the following lines both produce seg faults
// std::cout << (*f).x << std::endl;
// std::cout << f->x << std::endl;
}
Run Code Online (Sandbox Code Playgroud) 我正在使用C++ 14.我们假设我有一个class X和一个std::vector<X> mVector.
我还有以下代码:
std::shared_ptr<X> AddX(const X &x)
{
mVector.push_back[x];
return std::shared_ptr<X>(&mVector[mVector.size()-1])
}
Run Code Online (Sandbox Code Playgroud)
此方法将对象x插入mVector并返回一个指向此插入对象的共享指针.
X x1;
shared_ptr<X> pX1 = AddX(x1);
Run Code Online (Sandbox Code Playgroud)
一切正常,但当我插入第二个对象
X x2;
shared_ptr<X> pX2 = AddX(x2);
Run Code Online (Sandbox Code Playgroud)
pX1不指向插入的对象x1,因为最后一个push_back已经在内存中移动了它的位置(在硬调试之后看到).这对我来说很可惜,因为我的程序需要这些指针才能正常工作,并且mVector需要是动态的,它一直在修改(使用新X对象或删除旧对象).
我怎样才能解决这个问题?我想比一种方法可以使用对象索引而不是它们的指针,但这会惩罚我的执行时间,因为我应该每次修改时更新许多属性mVector.是否可以管理它并仍然使用指针?
我需要解释以下行为:
#include <iostream>
#include <memory>
#include <vector>
struct A {
std::string s = "foo";
std::weak_ptr<A> h;
std::shared_ptr<A> && getR() {
return std::move(h.lock());
}
std::shared_ptr<A> getL() {
return h.lock();
}
};
std::vector< std::shared_ptr<A> > storage;
std::vector< std::weak_ptr<A> > accountant;
void store(std::shared_ptr<A> && rr) {
std::cout << "store '" << rr->s << "' uses: " << rr.use_count() << std::endl;
storage.push_back(std::move(rr));
}
int main() {
// create keeper of A
auto keeper = std::make_shared<A>();
keeper->s = "bar";
// store weak_ptr-type handle with accountant …Run Code Online (Sandbox Code Playgroud) 我偶然发现了我正在使用的共享指针的意外行为.
共享指针实现引用计数和分离(例如,复制),如果需要,包含非const使用的实例.
为实现此目的,对于每个getter函数,智能指针都有一个const和一个non-const版本,例如:operator T *()和operator T const *() const.
问题:比较指针值nullptr导致分离.
预期:我认为比较运算符总是会调用const版本.
简化示例:(
此实现没有引用计数,但仍显示问题)
#include <iostream>
template<typename T>
class SharedPointer
{
public:
inline operator T *() { std::cout << "Detached"; return d; }
inline operator const T *() const { std::cout << "Not detached"; return d; }
inline T *data() { std::cout << "Detached"; return d; }
inline const T *data() const { std::cout << "Not detached"; …Run Code Online (Sandbox Code Playgroud) 我在绕着这个问题缠绕时遇到了一些困难,可能是因为我不完全理解底层的机制.
我有一个如下结构:
template <class T>
struct A {
int id;
T x;
}
Run Code Online (Sandbox Code Playgroud)
然后将此结构用作shared_ptr的类型:
typedef std::shared_ptr<A> A_ptr;
Run Code Online (Sandbox Code Playgroud)
然后将其存储在地图中:
typedef unordered_map<int , A_ptr> AMap;
Run Code Online (Sandbox Code Playgroud)
但是,当我编译时,我收到以下错误:
> error: type/value mismatch at argument 1 in template parameter list
> for 'template<class _Tp> class std::shared_ptr' typedef
> std::shared_ptr<A> A_ptr;
Run Code Online (Sandbox Code Playgroud)
我已阅读有关类似问题的其他帖子,但他们都建议在结构中创建shared_ptr A. 我试过这个,即使我无法从逻辑上理解为什么它会对我的问题有所帮助,但它不起作用.任何帮助表示赞赏.
我最近改变了我的原始指针,std::shared_ptr在这样的容器中使用:
std::vector<std::shared_ptr<AbstractPathContainer>> mGeneratedPaths;
Run Code Online (Sandbox Code Playgroud)
当我打电话clear()给这个容器时,它会reset()在每个容器上调用方法std::shared_ptr吗?