我有一个带有头文件的动态库,如下所示:
#ifndef SRC_H
#define SRC_H
#include<time.h>
namespace test
{
void sleep( int numsec );
}
#endif
和源文件如下:
#include"src.h"
namespace test
{
void sleep(int numsec)
{
sleep(numsec);
}
}
我有一个只包含以下主文件的可执行文件
#include "linked/src.h"
int main()
{
test::sleep(3);
}
我得到了
启动程序:/ usr0 / home / gschoenh / Dropbox / Code / cpp / scratch / main / app
[使用libthread_db启用的线程调试]
使用主机libthread_db库“/lib/x86_64-linux-gnu/libthread_db.so.1”。编程接收信号SIGSEGV,分段故障 test :: sleep(numsec = 3)中的0x00007ffff7bd863c位于src.cpp:8
8睡觉(numsec);
感谢您的帮助:)
PS:我花了很多时间试图自己解决这个问题。我已经解决了我自己的最后100个错误。所以请不要像“你^#* $(#($&amp;%(#_。)花费更多的时间来尝试自己做# $&amp; @ (#)@。”。感谢。答案 0 :(得分:9)
void sleep(int numsec)
{
sleep(numsec);
}
看起来像一个递归的无限循环。除非您的编译器执行尾递归消除,否则它可能会导致堆栈溢出。
如果这是对POSIX sleep
函数的调用,则在<unistd.h>
中声明它。添加#include <unistd.h>
后,您应该可以这样调用它:
::sleep(numsec);
答案 1 :(得分:0)
void sleep(int secs)
{
sleep(3);
}
上面的代码导致无限递归。我修改了代码,如:
#include <iostream>
#include <unistd.h>
void sleep(int secs)
{
using std::cout;
using std::endl;
cout << "Before sleep\n";
::sleep(3);
cout << "After sleep" << endl;
}
对我来说很好,g ++编译器版本g ++(Ubuntu / Linaro 4.6.3-1ubuntu5)4.6.3
另据 Linux 手册页http://linux.die.net/man/3/sleep;睡眠原型是
unsigned int sleep(unsigned int secs)
您还可以修改代码以存储从睡眠(unistd.h)返回到虚拟对象以解决冲突以及检查返回值(例如,如果呼叫被信号中断)。