boost :: shared_ptr可以释放存储的指针而不删除它吗?
我可以看到文档中没有发布功能,也在FAQ中解释了为什么它不提供发布功能,类似于发布不能在不唯一的指针上完成.我的指针是独一无二的.我该如何发布我的指针?或者哪个提升智能指针类使用,这将允许我释放指针?我希望你不要说使用auto_ptr :)
从C++ 11开始,由于几个原因,开发人员倾向于将智能指针类用于动态生命周期对象.而对于那些新的智能指针类,标准,甚至建议不使用运营商,new而是建议使用make_shared或make_unique避免一些容易出错.
如果我们喜欢使用智能指针类shared_ptr,我们可以构建一个类似的,
shared_ptr<int> p(new int(12));
Run Code Online (Sandbox Code Playgroud)
我们还希望将自定义删除器传递给智能指针类,
shared_ptr<int> p(new int(12), deleter);
Run Code Online (Sandbox Code Playgroud)
另一方面,如果我们喜欢使用make_shared分配,例如.int,而不是使用new和shared_ptr构造函数,就像上面的第一个表达式,我们可以使用
auto ip = make_shared<int>(12);
Run Code Online (Sandbox Code Playgroud)
但是,如果我们也希望将自定义删除器传递给make_shared,那么有没有正确的方法呢?好像编译器,至少gcc,给出错误,
auto ip = make_shared<int>(12, deleter);
Run Code Online (Sandbox Code Playgroud) 我正在为D编程语言开发一个自定义标记释放样式的内存分配器,它通过从线程局部区域分配来工作.似乎线程本地存储瓶颈导致从这些区域分配内存的巨大(~50%)减速与相同的单线程版本的代码相比,即使在设计我的代码以使每个分配只有一个TLS查找/释放.这是基于在循环中多次分配/释放内存,我试图弄清楚它是否是我的基准测试方法的工件.我的理解是线程本地存储基本上只需要通过额外的间接层访问某些东西,类似于通过指针访问变量.这是不正确的?线程本地存储通常有多少开销?
注意:虽然我提到D,但我也对D不具体的一般答案感兴趣,因为如果它比最佳实现慢,D的线程局部存储的实现可能会有所改进.
有没有办法配置或者是否有任何第三方插件可用于提供丰富的重构的Eclipse CDT(任何版本)?我的重构菜单仅在Eclipse Indigo CDT中提供以下内容:
我正在寻找具有Java重构丰富性的东西:
或者像DevExpress Refactor Pro提供的东西:
http://www.devexpress.com/Products/Visual_Studio_Add-in/Refactoring/
请注意,DevExpress插件与Eclipse不兼容.我非常愿意为一个好的第三方插件买单(它只需要在Eclipse中支持C++).
backtrace函数给出一组回溯如何用函数名/文件名/行号映射它?
for ex:-
backtrace() returned 8 addresses
./libtst.so(myfunc5+0x2b) [0xb7767767]
./libtst.so(fun4+0x4a) [0xb7767831]
./libtst.so(fun3+0x48) [0xb776787f]
./libtst.so(fun2+0x35) [0xb77678ba]
./libtst.so(fun1+0x35) [0xb77678f5]
./a.out() [0x80485b9]
/lib/libc.so.6(__libc_start_main+0xe5) [0xb75e9be5]
./a.out() [0x80484f1]
Run Code Online (Sandbox Code Playgroud)
从上面的堆栈我怎样才能获得文件名和行号?我做了以下事情,但没有运气.如果我错了,请纠正我:)
for ex:-
./libtst.so(fun2+0x35) [0xb77dc887]
0xb77dc887(fun2 addr+offset)-0xb77b6000 (lib starting addr) = 0x26887 (result)
result is no way related to function in nm output.
I used addr2line command:-
addr2line -f -e libtst.so 0xb77dc887
??
??:0
Run Code Online (Sandbox Code Playgroud)
那么,我如何在运行时或运行后解析?提前致谢...
nm:-
00000574 T _init
00000680 t __do_global_dtors_aux
00000700 t frame_dummy
00000737 t __i686.get_pc_thunk.bx
0000073c T myfunc5
000007e7 T fun4
00000837 T fun3 …Run Code Online (Sandbox Code Playgroud) 从上一个问题:
如果你试图传递
float给printf它,它会double在printf收到它之前被提升
printf()是一个可变函数吧?可变参数函数在传递之前是否会提升float参数double?
我指的是Skienna的算法书.
测试图是否G包含a的问题Hamiltonian path是NP-hard,哈密顿路径P是一个只访问每个顶点一次的路径.与汉密尔顿循环问题不同,从结束顶点到P的起始顶点不一定有G的边缘.
给定有向非循环图G(DAG),给出O(n + m)时间算法来测试它是否包含哈密顿路径.
我的方法,
我打算用DFS和Topological sorting.但我不知道如何将这两个概念联系起来解决问题.如何使用拓扑排序来确定解决方案.
有什么建议?
algorithm hamiltonian-cycle directed-acyclic-graphs graph-algorithm
我在远程系统上生成了一个我无法直接访问的核心文件.我还有来自远程系统的库文件的本地副本,以及崩溃程序的可执行文件.
我想在gdb中分析这个核心转储.
例如:
gdb path/to/executable path/to/corefile
Run Code Online (Sandbox Code Playgroud)
我的库位于当前目录中.
在过去,我见过调试器通过提供选项"-p"来实现它.或"-p/=."; 所以我的问题是:
在分析gdb中的核心文件时,如何指定首先从相对于当前目录的路径加载库?
Valgrind抛出了这个错误:
==11204== Syscall param write(buf) points to uninitialised byte(s)
==11204== at 0x4109033: write (in /lib/libc-2.13.so)
==11204== by 0x8049654: main (mmboxman.c:289)
==11204== Address 0xbe92f861 is on thread 1's stack
==11204==
Run Code Online (Sandbox Code Playgroud)
有什么问题?我无法找到它正在大喊大叫的未初始化的字节.以下是犯罪行代码(提到的289行是调用函数lockUp的行):
Request request;
Response response;
fillRequest(&request, MANADDUSER, getpid(), argument1, NULL, NULL, 0, 0);
lockUp(&request, &response, NULL);
Run Code Online (Sandbox Code Playgroud)
这里函数原型和结构声明:
void fillRequest(Request *request, char code, pid_t pid, char *name1, char *name2, char *object, int id, size_t size)
{
int k;
request->code = code;
request->pid = getpid();
if(name1) for(k=0; k<strlen(name1)+1; k++) request->name1[k] = name1[k];
else …Run Code Online (Sandbox Code Playgroud) c++ ×4
c ×3
shared-ptr ×2
ads ×1
algorithm ×1
boost ×1
c++11 ×1
click ×1
coredump ×1
d ×1
debugging ×1
eclipse ×1
eclipse-cdt ×1
gdb ×1
linux ×1
make-shared ×1
path ×1
performance ×1
printf ×1
refactoring ×1
stack-trace ×1
valgrind ×1