小编jsc*_*ier的帖子

如何完全禁用断言

我的代码充满了召唤assert(condition).在调试版本中,我使用了g++ -g我的断言.令我惊讶的是,我可以看到断言也在我的发布版本中运行,编译时没有-g选项.

如何在编译时完全禁用我的断言?我应该NDEBUG在我生成的任何构建中明确定义,尽管它们是调试,发布或其他任何其他?

c c++ assert

70
推荐指数
5
解决办法
5万
查看次数

在传统的Linux fork-exec中使用_exit()和exit()有什么区别?

我一直试图弄清楚如何在Linux内部使用fork-exec机制.根据计划,一切都在继续,直到一些网页开始让我困惑.

据说,一个子进程应该严格使用_exit()而不是简单exit()或正常的返回main().

据我所知,Linux shell fork-execs每个外部命令; 假设我上面说的是真的,结论是这些外部命令和Linux shell中发生的任何其他执行都不能正常返回!

维基百科和其他一些网页声称,我们必须使用_exit()它来防止子进程导致删除父进程的临时文件,同时可能会发生stdio缓冲区的双重刷新.虽然我理解前者,但我没有任何线索如何双重刷新缓冲区可能对Linux系统有害.

我花了一整天的时间......感谢任何澄清.

c linux fork return exit

50
推荐指数
3
解决办法
3万
查看次数

检测谁创建了一个线程(w.Eclipse)

如何找出谁在Java中创建了一个Thread?

想象一下:您在复杂的插件环境中使用~30 个第三方 JAR.你启动它,运行大量代码,做一些计算,最后调用shutdown().

这个生命周期通常可以正常工作,除了在每次运行中一些(非守护)线程保持悬空状态.如果每次关机都是最后一次关机,那就不会有问题,在这种情况下我可以简单地运行System.exit().但是,这个循环可能会运行几次,并且每次传递都会产生更多的垃圾.

所以我该怎么做?我在Eclipse的Debug View中看到了线程.我看到他们的堆栈痕迹,但他们没有任何关于它们的起源的暗示.没有创建者的堆栈跟踪,没有可区分的类名,没有.

有谁知道如何解决这个问题?

java eclipse multithreading stack-trace

22
推荐指数
2
解决办法
3996
查看次数

21
推荐指数
2
解决办法
5万
查看次数

C/C++中注释行末尾的反斜杠

您的编辑/ ide是否强调a++;在此C/C++代码中作为注释的一部分?

int a=1;
//some comment \
a++;
printf("%d\n",a);
Run Code Online (Sandbox Code Playgroud)

那怎么样?

int a=1;
//some comment ??/
a++;
printf("%d\n",a);
Run Code Online (Sandbox Code Playgroud)

c c++ ide editor highlighting

16
推荐指数
1
解决办法
1772
查看次数

简单的圆形手势检测

我正在寻找一种简单的,以编程方式检测用户是否绘制了圆形的方法.我在C工作,但很高兴从伪代码工作.一些谷歌搜索带来了许多(希望)过于复杂的方法.

我正在跟踪鼠标坐标作为浮点数,并创建了一个矢量数组来跟踪鼠标随时间的移动.基本上我想要检测何时绘制一个圆,然后忽略与该圆无关的所有运动数据.

我基本了解如何实现这一目标:

使用轮询功能跟踪所有移动.每次轮询该功能时,都会存储当前鼠标位置.在这里,我们遍历历史位置数据并做一个粗略的"对齐位置"来比较两个位置.如果新位置距离旧位置足够近,我们会删除旧位置之前的所有历史数据.

虽然这在理论上有效,但在实践中却是一团糟.有没有人有什么建议?如果建议的方法可以检测它是顺时针还是逆时针绘制的加分点.

c gesture-recognition

15
推荐指数
2
解决办法
5373
查看次数

堆栈是如何初始化的?

当进程请求内存并且操作系统向进程提供一些新页面时,内核应该初始化页面(例如,使用零),以避免显示另一个进程使用的可靠数据.当进程启动并接收一些内存时也是如此,例如堆栈段.

当我在Linux中执行以下代码时,结果是大部分已分配的内存确实为0,但堆栈底部大约3-4 kB(数组的最后一个元素,最高地址)包含随机数.

#include <cstdlib>
#include <iostream>
using namespace std;

int main()
{
    int * a = (int*)alloca(sizeof(int)*2000000);
    for(int i = 0; i< 2000000; ++i)
        cout << a[i] << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
  1. 为什么它也没有设置为零?
  2. 可能是因为它被这个过程重用了吗?
  3. 如果是,那么早期使用那些3-4 kB内存的初始化代码是不是?

c c++ linux

15
推荐指数
3
解决办法
2270
查看次数

c ++尝试捕获实践

这在C++中被认为是很好的编程实践:

try {
// some code

}
catch(someException) {
// do something
}
catch (...) 
{

// left empty   <-- Good Practice???
} 
Run Code Online (Sandbox Code Playgroud)

c++ exception-handling

14
推荐指数
5
解决办法
6365
查看次数

阅读Elf Binary中的GOT条目

我想写一个小函数的跟踪器.我用ptrace.我在ubuntu x86_64上.我想找到共享库函数的地址(比如printf).

但我有一些问题和一些关于全球抵消表的问题.我有以下代码:

size_t baseAddress = this->getBaseAddress();
Elf_Ehdr const * headerElf = static_cast<Elf_Ehdr const *> (this->_manager.readMemory((void*) baseAddress, sizeof (Elf_Ehdr)));
Elf_Phdr const * headerProgram = static_cast<Elf_Phdr const *> (this->_manager.readMemory((void*) (baseAddress + headerElf->e_phoff), headerElf->e_phentsize * headerElf->e_phnum));
unsigned int i = 0;
while (headerProgram[i].p_type != PT_DYNAMIC)
{
    ++i;
}
size_t addrToRead = headerProgram[i].p_vaddr;
Elf_Dyn const * dynSection = static_cast<Elf_Dyn const *> (this->_manager.readMemory((void*) addrToRead, sizeof (Elf_Dyn)));
while (dynSection->d_tag != DT_PLTGOT)
{
    addrToRead += sizeof (Elf_Dyn);
    dynSection = static_cast<Elf_Dyn const *> (this->_manager.readMemory((void*) addrToRead, …
Run Code Online (Sandbox Code Playgroud)

c++ linux elf

13
推荐指数
1
解决办法
2167
查看次数

加载共享库时出错

我有一个项目组织为

\bin\cmain
\lib\libxmlrpc_client++.a
\lib\libxmlrpc_client++.so.4
\lib\libxmlrpc_client++.so.4.16
Run Code Online (Sandbox Code Playgroud)

我的c程序cmain需要动态链接clib.so.4.当我编译代码时,我-L.../lib用来指示目录lib和使用-lxmlrpc_client++.但是,我的代码在加载共享库时出错:

libxmlrpc_client++.so.4: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)

有什么想法解决这个问题?

PS:问题解决了,问题的一个很好的参考:http://gcc.gnu.org/ml/gcc-help/2005-12/msg00017.html

c c++ linker

13
推荐指数
1
解决办法
8533
查看次数