Articles of c + +

关心使用共享内存与CreateFileMapping和MapViewofFile

我有2个关于使用共享内存的问题。 我正在使用CreateFileMapping在两个进程之间创build共享内存区域。 1)我知道我需要调用CreateFileMapping或OpenFileMapping调用返回的每个句柄的CloseHandle来释放内存。 我的问题是,如果使用共享内存的程序在不调用CloseHandle的情况下退出,那么所有的句柄都会被适当的closures,而mem被Windows XP / 7解除分配? IE浏览器 – 所有使用内存的进程closures后,是否有可能发生内存泄漏? 2)我使用MapViewofFile获取指向mem的指针。 在一个实例中,我假设共享内存将始终存在于方法的上下文中。 所以我将MapViewOfFile的返回值保存为一个指针,并closures了mem的句柄,并使用指向共享mem的指针(但仍然locking对它的访问)。 这是安全的,还是我应该每次访问共享内存调用MapViewOfFile? 谢谢, 伊恩

如何判断用CreateProcess启动的进程是否仍在运行?

如果我有通过CreateProcess()创build的进程,我将如何确定它是否仍在运行? 我知道我需要使用pi.hProcess但我不知道如何,谷歌并没有真正给我有意义的提示。 PROCESS_INFORMATION pi; STARTUPINFO si; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); bool got_it=CreateProcess(NULL, CA2T(launchString.c_str()), NULL, NULL, false, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);

为什么我的简单Hello世界C ++应用程序使用3个线程?

当我看着Windows任务pipe理它说,它使用3线程? 为什么是这样? 我期待只有一个线程被使用。 我使用Netbeans IDE和MinGW-Windows g ++来编译它。 谢谢 码: #include <iostream> using namespace std; int main() { cout << "Hello World"; int input; cin >> input; return (EXIT_SUCCESS); }

在Windows中的目录有一个inode号码?

我需要在Windows中find一个目录的inode号码。 使用_stat和_stat64函数,我可以获取文件的inode和其他信息。 但是,当我使用相同的Windows目录,它总是给任何目录相同的号码。 有没有办法findWindows目录的inode号码?

用于从二进制文件中提取图标的C / C ++库

我打算为Windows构build一个热键启动的应用程序启动器。 我打算把它作为一个popup式的图标网格,然后你可以点击并启动你所需要的。 我希望它自动扫描开始菜单和桌面程序快捷方式并编目。 但是,我不知道如何去从快捷方式/实际的二进制文件的图标检索过程,我想知道是否有任何库的C / C + +处理这种事情? 如果不是的话,我会怎么做呢?

通过套接字发送图片(发送func)在c + +,但不要收回完整(Windows)!

我正在从客户端发送数据到服务器,但图片没有收到完整。 客户代码: FILE *fr = fopen(tmppicsend, "rb"); char* buffer; buffer = (char*) malloc(sizeof(char)*size); fread(buffer, size, 1, fr); send_len_pic = send( m_socket_pic, buffer, size, 0 ); recv( m_socket_pic, rec_end_check, 32, 0 ); fclose(fr); free(buffer); 服务器代码: FILE *fw = fopen(fname, "wb"); char* buffer; buffer = (char*) malloc(sizeof(char)*size); int rec_len = recv( current_client, buffer, size, 0 ); buffer[size]='\0'; […]

从文件并发处理

考虑下面的代码: std::vector<int> indices = /* Non overlapping ranges. */; std::istream& in = /*…*/; for(std::size_t i= 0; i< indices.size()-1; ++i) { in.seekg(indices[i]); std::vector<int> data(indices[i+1] – indices[i]); in.read(reinterpret_cast<char*>(data.data()), data.size()*sizeof(int)); process_data(data); } 我想使这个代码并行,尽可能快。 使用PPL进行parallizing的一种方法是: std::vector<int> indices = /* Non overlapping ranges. */; std::istream& in = /*…*/; std::vector<concurrency::task<void>> tasks; for(std::size_t i= 0; i< indices.size()-1; ++i) { in.seekg(indices[i]); std::vector<int> data(indices[i+1] […]

为什么utf-8字符不显示在cmd.exe中?

我在Windows下testingc + + 11string文字与tdm-gcc: #include <iostream> int main(int argc, char** argv) { std::cout << u8"你确定要这么做吗" << std::endl; return 0; } 命令行: e:\src\c++\11>g++ utf8_literal.cc -std=c++11 使用chcp 65001将代码更改为utf8,然后运行该应用程序,结果如此 你的第一个汉字是不正确的。 但是,如果添加一个英文字符,例如a那么显示是正确的: 因此我们可以排除字体问题。 为什么第一个字符拒绝显示前面没有英文字符?

如何定义task.json通过在Windows上使用cl.exe来编译vscode中的C / C ++代码?

我已经在64位win10上安装了Microsoft Visual C ++ Build Tools 2015,并且可以使用cl.exe通过以下步骤(通过设置path和环境中的一些说明)在简单的命令提示符窗口中编译和链接C / C ++程序命令行版本的variables ): 1. cd "\Program Files (x86)\Microsoft Visual Studio 14.0\VC" 2. vcvarsall amd64 3. cl helloworld.c helloworld.c只是一个简单的C源文件来打印“Hello world!”。 我也尝试使用task.json来直接编译和链接vs代码中的C / C ++程序。 这是我的task.json: { // See https://go.microsoft.com/fwlink/?LinkId=733558 // for the documentation about the tasks.json format "version": "0.1.0", "command": "vcvarsall amd64 && cl", "isShellCommand": true, "args": ["${file}"], […]

覆盖文件没有损坏的文件的风险

所以经常我的应用程序想保存文件以后再加载。 最近因为崩溃而倒霉了,我想以这样一种方式编写操作,即保证有新的数据或原始数据,但不会有混乱。 我的第一个想法是做一些事情(保存一个名为example.dat的文件): 为目标目录提供一个唯一的文件名,例如example.dat.tmp 创build该文件并写入我的数据。 删除原始文件(example.dat) 重命名(“移动”)临时文件到原来的位置(example.dat.tmp – > example.dat)。 然后在加载时应用程序可以遵循以下规则: 如果没有“example.dat”而没有“example.dat.tmp”,首先运行/新build项目,这样就加载默认/新build文件。 如果“example.dat”没有“example.dat.tmp”,则加载example.dat(正常载入大小写) 如果存在“example.dat.tmp”,则为用户提供潜在恢复数据的机会。 如果还存在“example.dat”,则不要在没有明确的用户常量的情况下覆盖它。 但是,我做了一些小小的研究后发现,除了操作系统caching(我可以用文件刷新方法覆盖)之外,有些磁盘驱动器仍然可以在内部caching,甚至可能对操作系统说谎,因此4可以完成,写入不实际写入,如果系统closures,我已经丢失了我的数据… 我不确定磁盘问题实际上是由应用程序解决的,但是正确的事情上面的一般规则是? 我应该保留一个旧的文件恢复副本,以确保更长的时间,有关这些事情的指导方针是什么(例如,可接受的磁盘使用情况,用户应该select,放置这些文件的位置等)。 另外我应该如何避免潜在的冲突用户和其他程序“example.dat.tmp”。 我记得有时候从其他软件中看到“〜example.dat”,这是一个更好的约定吗?