3

我有一个带有头文件的动态库,如下所示:

#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,分段错误。
0x00007ffff7bd863c 在 test::sleep (numsec=3) at src.cpp:8
8 sleep(numsec);

谢谢您的帮助 :)

PS:我花了很多时间试图自己解决这个问题。我自己解决了最后 100 个错误。所以请不要像“你 ^#*$(#($&%(#_. 花更多时间尝试自己做# $&@ (#)@。”这样的火焰评论。谢谢。

4

2 回答 2

9
void sleep(int numsec)
{
    sleep(numsec);        
}

看起来像一个递归无限循环。除非您的编译器进行尾递归消除,否则可能会导致堆栈溢出。

如果假设这是对 POSIXsleep函数的调用,则它在<unistd.h>. 添加后,您应该可以这样称呼它#include <unistd.h>

::sleep(numsec);
于 2013-04-09T23:10:59.757 回答
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) 的返回存储到一个虚拟对象中以解决冲突以及检查返回值(例如调用是否被信号中断)。

于 2013-04-10T04:22:39.473 回答