我有一种情况,我想比较一个shared_ptr封装的对象与堆栈上创建的相同类型的对象.目前,我正在获取原始指针并取消引用它来进行比较,例如:
Object A;
std::shared_ptr<Object> B;
// assume class Object has its comparison operators overloaded
if ( *B.get() < A )
// do stuff here
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?这假设当两个对象相遇以便相互比较时,一个是shared_ptr而另一个不是.
我正在调查具有Windows CE和Mobile"共享"功能的智能指针,其中VS 2008 tr1 std::shared_ptr无法使用(由于与CE上没有的v.9 dll的链接,显然,如果我理解正确的话).
有一篇半旧的MSDN杂志文章,其中包含来自Microsoftie(Eric Niebler)的消息:使用我们的自定义C++类实现更可靠的资源管理.
他的推理,设计和实现shared_any看起来很稳固,但我想知道是否有人在任何平台(不一定是WinCe/WM)上实际测试过该批次?
我在这个项目上工作,
我遇到的问题是,当我需要它时,它并没有真正被删除,因为它有一些指向它的共享指针.
我该如何解决这个问题,请帮忙.
我有以下代码:
#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) 使用任何一个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)
我错过了什么?谢谢.
我试图理解的语法boost::scoped_ptr.让我们定义并向标准输出写入scoped_ptr指针及其指向的值:
#include <boost/scoped_ptr.hpp>
#include <iostream>
int main()
{
boost::scoped_ptr<int> p{new int{1}};
std::cout << p.get() << '\n'; // ok
std::cout << p << '\n'; // error
std::cout << *p.get() << '\n'; // ok
std::cout << *p << '\n'; // ok. *p==*p.get()
}
Run Code Online (Sandbox Code Playgroud)
题.为什么现在*p.get()==*p却std::cout << p << '\n';不会编译?
我的工作on g++ -std=c++11 -O2 -Wall -pedantic.
我有一个auto_ptr的地图,我只是想设置和获取地图元素,但它产生的编译器错误.我不明白编译器错误意味着什么,出错了什么?
获取编译错误:
[错误]将'const std :: auto_ptr'作为'this'参数传递给'std :: auto_ptr <_Tp> :: operator std :: auto_ptr_ref <_Tp1>()[with _Tp1 = int; _Tp = int]'丢弃限定符[-fpermissive]
设置编译器错误:
[错误]'operator ='不匹配(操作数类型是'std :: map,std :: auto_ptr> :: mapped_type {aka std :: auto_ptr}'和'int*')
另外我听说不建议在标准c ++库集合(list,vector,map)中使用auto_ptr.我应该在下面的代码中使用什么样的智能指针?
std::map <std::string, std::auto_ptr<int> > myMap;
// Throws compiler error
std::auto_ptr <int> a = myMap["a"];
// Also throws compiler error
myMap["a"] = new int;
Run Code Online (Sandbox Code Playgroud) 我有一个代码,它使用自c ++ 11以来支持的std :: unique_ptr.
#include <memory>
int main() {
std::unique_ptr<int> p_int(new int(3));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我可以构建这个代码,但我仍然感到困惑.因为我的g ++版本是4.8.2,它支持c ++ 11.g ++使用c ++ 0x作为默认值的原因是什么?我应该如何将c ++ 11设置为默认值?现在我正在使用cmake,所以也许我应该在CMakeLists.txt中设置c ++ 11 ..
$ which g++
/usr/bin/g++
$ g++ --version
g++ (20140812 (SCEL u2.0.0.0)) 4.8.2
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ g++ main.cc
main.cc: In function ‘int main()’:
main.cc:4:2: …Run Code Online (Sandbox Code Playgroud) 我已经决定转向现代的c ++实践,我试图调整我的旧代码来使用智能指针.我有一个数据包类,包含数据包数据,以及其他一些变量.
class Packet
{
public:
Packet(int connId, std::shared_ptr<char[]> buff, size_t pLen)
: connID(connId), packetLen(pLen)
{
buffer = buff;
}
Packet(){}
int connID;
size_t packetLen;
std::shared_ptr<char[]> buffer;
};
Run Code Online (Sandbox Code Playgroud)
我有一个测试功能,可以在新分配的缓冲区中创建和插入数据.
std::vector<Packet> packetV;
void createPacket()
{
std::shared_ptr<char[]> data = std::make_shared<char[]>(10);
for (int i = 0; i < 5; ++i)
{
uint8_t byte = 5;
memcpy(*data.get() + i, &byte, sizeof(uint8_t));
}
packetV.push_back(Packet(1, data, 5*sizeof(uint8_t)));
}
//(Main function)
void main()
{
std::string input;
do
{
std::cin >> input;
if (input == "packet") createPacket();
else …Run Code Online (Sandbox Code Playgroud) 我最近改变了我的原始指针,std::shared_ptr在这样的容器中使用:
std::vector<std::shared_ptr<AbstractPathContainer>> mGeneratedPaths;
Run Code Online (Sandbox Code Playgroud)
当我打电话clear()给这个容器时,它会reset()在每个容器上调用方法std::shared_ptr吗?