在为工作中的客户端/服务器系统构建单元测试时,我遇到了一个问题,即在我关闭所有活动处理程序(我知道)后,我的io_service没有释放.
经过一天的代码搜索后,我遇到了错误的处理程序,该处理程序尚未集成到我的客户端关闭程序中.
我的问题是:是否有一种简单的方法可以在boost io_service中列出当前活动的处理程序?如果没有,为什么不呢?
任何见解将不胜感激.
考虑以下代码:
int function()
{
int a = 1 ;
int b = helper(&a);
return b ;
}
int main()
{
function();
return 0 ;
}
Run Code Online (Sandbox Code Playgroud)
尽管事实上尚未声明名为"helper"的函数,但此代码段使用gcc编译成目标代码而没有问题.我知道链接器应该捕获这个,但是我已经看到了一旦包含正确的头文件(包含函数声明)而解决的模糊错误,尽管链接器和编译器没有生成任何错误.
有许多gcc警告似乎是相关的,但实际上并没有实现我想要的:-Wmissing-prototypes,-Wmissing-declarations和-Wstrict-prototypes.不幸的是,当定义全局函数时,这些警告仅限于缺少原型,我对引用全局函数时缺少原型的警告感兴趣.
任何人都可以建议替代品吗?谢谢.
令我惊讶的是,一个已经完成执行但尚未加入的C++ 11 std :: thread对象仍然被认为是一个活动的执行线程.下面的代码示例(在Xubuntu 13.03上使用g ++ 4.7.3构建)说明了这一点.有谁知道C++ 11标准是否提供了一种方法来检测std :: thread对象是否仍在主动运行代码?
#include <thread>
#include <chrono>
#include <iostream>
#include <pthread.h>
#include <functional>
int main() {
auto lambdaThread = std::thread([](){std::cout<<"Excuting lambda thread"<<std::endl;});
std::this_thread::sleep_for(std::chrono::milliseconds(250));
if(lambdaThread.joinable()) {
std::cout<<"Lambda thread has exited but is still joinable"<<std::endl;
lambdaThread.join();
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我有一个CERT_CONTEXT结构,我通过CryptoAPI从Windows上的智能卡中提取.我需要将此结构转换为与OpenSSL一致的DER编码字节数组.到目前为止,我所得到的最接近的匹配是通过CryptEncodeObject使用X509_ASN_ENCODING和X509_CERT_TO_BE_SIGNED修改它接受CERT_INFO结构作为输入.
问题是它与OpenSSL i2d_X509函数产生的输出不匹配.使用2048位x509证书作为输入,OpenSSL产生1789字节的编码输出,而Windows CryptoAPI产生1638字节的编码输出.
我能看到的唯一选择是使用CERT_CONTEXT结构中的值动态创建X509证书,并使用i2d_X509函数直接对结果对象进行编码.唯一的问题是我无法从智能卡中提取私钥,因此这可能会导致x509证书创建例程出现问题.
如果有人能就这些问题提供任何见解/建议/提示,我会非常感激.
我有一个C ++类,它声明一个静态成员。整个类都包含在头文件中,我宁愿避免仅创建一个包含静态成员定义的.cpp文件。我一直在尝试使用static关键字(在C方面)和匿名名称空间,这两者都应提供在头文件中声明的变量静态链接(asfaik),但两种方法都行不通,谁能给我解决方案问题?
struct ServiceType {} ;
struct Transport
{
static ServiceType service ;
};
//error: definition of ‘Transport::service’ is not in namespace enclosing ‘Transport’
//namespace { ServiceType Transport::service ; }
//error: ‘static’ may not be used when defining a static data member
//static ServiceType Transport::service ;
Run Code Online (Sandbox Code Playgroud) 我有一个TCP套接字读取数据.当读取数据时发生错误,我返回一个undef(NULL)值.错误格式化的消息或损坏的套接字可能导致错误.有人能告诉我是否有一个返回套接字状态的特定函数?
可能重复:
C++逗号运算符
大约一年前,我在我正在编写的编码项目中注意到一些模糊的语法:
table_value = table_index += 2, valueFromTable(table_index);
Run Code Online (Sandbox Code Playgroud)
有没有人认识到这一点?它就像一个带有附加声明的作业.这是在我们的整个跨平台编译器套件中编译的,所以我很确定它有效的C++,但我从未见过类似的东西.
任何见解将不胜感激.
Gearoid
编辑:继承人一些工作代码:
#include <iostream>
using namespace std ;
int valueFromTable(int a) { return a ; }
int main()
{
int table_index = 0 ;
int table_value = table_index += 2, valueFromTable(12);
cout<<table_value<<endl;
return 0 ;
}
Run Code Online (Sandbox Code Playgroud) 我有一个来自Firewire天文相机的灰度视频流,我想使用FFmpeg来压缩视频流,但它不接受MPEG1VIDEO编解码器的单字节像素格式.如何使用FFmpeg API将灰度视频帧转换为FFmpeg接受的帧格式?
最近,我遇到了对new运算符的异常使用,以重新初始化C ++类,其代码如下:
#include <iostream>
struct Test { Test() { std::cout<<"Test Ctor\n"; } };
int main()
{
Test t ;
new (&t) Test;
return 0 ;
}
Run Code Online (Sandbox Code Playgroud)
如果运行此代码,则会两次调用Test ctor。在这种情况下,似乎“ new”运算符正在使用指向对象的指针作为内存源,而不是分配新内存,valgrind确认没有内存泄漏。
有人可以阐明“新”运算符的用法吗?
我们今天遇到了一个不寻常的现象,一位同事在他的代码中调用了一个通常表现良好的函数,该函数触发了libc(gethostbyname)中的段错误.令人费解的是,同一个函数在同一运行时的其他源文件中没有遇到麻烦.令人惊讶的是,当使用valgrind时,segfault消失了,事实上,它与valgrind完美配合,没有报告错误.
经过多次牺牲以安抚编译器之后,我们最终意识到声明该函数的头文件在调用该函数的源文件中丢失了.一旦我们添加了这个,一切都正常运行.
为什么gcc/ld没有生成错误(甚至是警告),表明函数未被识别?为什么它与valgrind一起工作?
谢谢.
c++ ×6
gcc ×2
asn.1 ×1
boost ×1
boost-asio ×1
c ×1
c++11 ×1
compression ×1
cryptoapi ×1
ffmpeg ×1
linkage ×1
linker ×1
linux ×1
mpeg ×1
namespaces ×1
new-operator ×1
openssl ×1
perl ×1
sockets ×1
static ×1
syntax ×1
tcp ×1
valgrind ×1
video-codecs ×1
x509 ×1