- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Valgrind 报告了一个错误:
==5644== Conditional jump or move depends on uninitialised value(s)
这发生在 pid_t
类型的变量上。
我的代码如下:
GmpPipePlayer::GmpPipePlayer( IOBase *pIO, Referee *pBack, PieceColor pc, int size, const DataBoard *pBd, int handicap, const char *cmd_line, int bDebug )
: GmpPlayer(pIO, pBack, pc, size, pBd, handicap, bDebug)
{
int down[2], up[2];
pid_t _pid; //here the var is declared
pipe(down);
pipe(up);
_pid = fork();
if (_pid < 0)
exit(1);
if (_pid == 0)
{
close(down[1]);
close(up[0]);
dup2(down[0], 0);
dup2(up[1], 1);
execl("/bin/sh", "sh", "-c", cmd_line, NULL);
_exit(1);
}
close(down[0]);
close(up[1]);
_down = down[1];
_up = up[0];
_reader_thd = new Thread(reader_wrapper, this);
}
GmpPipePlayer::~GmpPipePlayer()
{
if (_pid > 0) //valgrind is reporting that the error is here!!
{
kill(_pid, SIGTERM);
_pid = 0;
}
if (_up)
{
close(_up);
_up = 0;
}
if (_down)
{
close(_down);
_down = 0;
}
delete _reader_thd
}
所以,我认为问题是_pid
没有初始化,应该如何初始化这个变量呢?我这样试过:
pid_t _pid=0;
但这仍然导致同样的错误。这段代码在这个过程中被调用了很多次。
最佳答案
您似乎有两个名为 _pid
的变量 - 您在构造函数中声明的本地变量:
pid_t _pid; //here the var is declared
以及您在析构函数中访问的那个:
if (_pid > 0) //valgrind is reporting that the error is here!!
这些变量并不相同:您在析构函数中访问的变量必须是全局变量或实例变量(更有可能)。
由于你依赖_pid
将状态从构造函数传递到析构函数,你需要从构造函数中移除局部声明,并将另一个_pid
初始化为合适的。如果是实例变量,将它的初始化添加到初始化列表中,像这样:
GmpPipePlayer::GmpPipePlayer( IOBase *pIO, Referee *pBack, PieceColor pc, int size, const DataBoard *pBd, int handicap, const char *cmd_line, int bDebug )
: GmpPlayer(pIO, pBack, pc, size, pBd, handicap, bDebug), _pid(0) {
... // HERE ------------------^
}
关于c++ - 初始化 pid_t 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12700531/
我正在尝试将 pid 转换为字符串。我这样试过: int pid = getpid(); //this int conversion should be ok as far as I know cha
我正在用 C 进行编码,并尝试 fork 一个服务器,该服务器接受从客户端到其自己进程的连接,但是,在我使用命令行参数终止它后,该服务器仍然继续接受指定端口上的连接。 pid_t server_id;
我有以下代码: ... printf("Started %d", pid); FILE * fh; fh = fopen("run/source.pid", "wb"); fwrite(&pid, s
Valgrind 报告了一个错误: ==5644== Conditional jump or move depends on uninitialised value(s) 这发生在 pid_t 类型的
我在通过引用将 pid_t 作为 void 指针传递并将其类型转换回 pid_t 时遇到问题。我的代码如下: typedef void * ProcessHandle_t; void createPr
我有以下功能: void test_fork() { pid_t id; printf("Parent process id: %d\n", getpid()); id = f
以下代码: #include #include #include int main() { pid_t mypid = getpid(); write(1, &mypid, si
所以,我需要将 pid strcat 到某个字符串。我有这个 strcat (str,(char*)getpid()); 但这行不通。 ----编辑---- 好的,我理解反对票。我太快发布问题了。并没
如何方便地确定 pid_t 类型的最大值?我的系统上没有 PID_MAX 常量。 (注意,我指的是数据类型允许的最大值,而不是系统分配给进程的事实上最大值。) 用例:我正在将用户提供的 pid 字符串
我正在尝试获取特定窗口的 pid_t(使用 CGWindowListCopyWindowInfo)。在 swift 中与类型转换进行斗争之后,我终于可以获得 windowOwnerPID var wi
所有数据类型,如 int、long、char,只要我在 VIM 中输入它们就会自动高亮显示。但是,很少有异常(exception),例如 pid_t、mode_t.. 如何让它们默认突出显示? 最佳答
我对(例如)pid_t 的声明感到困惑。 __pid_t 是什么意思?它是在别处定义的另一种类型吗?如果是,在哪里?为什么我在 ubuntu 13.04 64bit 中的 types.h 定义 pid
是否可以获取已知其 PID 的打开应用程序的 AXUIElementRef? 我的项目正在打开一个文件/文件夹。然后我获取它的 PID,并且我希望能够访问这个打开的窗口,这就是我想要它的 AXUIEl
我目前正在使用显式转换为 long 并使用 %ld 打印 pid_t,是否有诸如 %z 之类的说明符对于 size_t 对于 pid_t? 如果不是,打印 pid_t 的最佳方式是什么? 最佳答案 没
我正在使用 Linux (3.13.0-24-generic#46-Ubuntu),并编写了一个简单的 C 程序关于pid。 编译时,我遇到了一些问题: gcc pid_test.c,没问题。 gcc
使用 size_t 和 pid_t 类型的逻辑运算符的正确方法是什么?我的意思是:像下面这样写是合法的吗? 例如: size_t sz; /* some kind of assignment */
我正在编写一个程序,其中可以创建多个子进程,并且即使子进程尚未终止,父进程也会继续执行。但是,一旦它们终止,我希望在提示用户创建更多子进程之前打印它们。 根据我对(waitpid((pid_t)-1,
像getpid() 这样的调用背后的逻辑是什么returning a value of type pid_t 而不是 unsigned int?还是 int?这有什么帮助? 我猜这与便携性有关?保证
在 Linux 系统(32 位或 64 位)上,pid_t、uid_t 和 gid_t 的大小是多少? 最佳答案 #include #include int main() { printf
我想自动比较和交换 pid_t 变量。我在标准中读到它是 int 类型。 我知道 atomic_compare_exchange_strong_explicit() 可以自行管理。我需要做的就是将类型
我是一名优秀的程序员,十分优秀!