小编qui*_*uss的帖子

巨大的std :: vector <std :: vector>在销毁时不会释放所有内存

当使用非常大的向量向量时,我们发现没有释放部分内存.

#include <iostream>
#include <vector>
#include <unistd.h>

void foo()
{
    std::vector<std::vector<unsigned int> > voxelToPixel;
    unsigned int numElem = 1<<27;
    voxelToPixel.resize( numElem );

    for (unsigned int idx=0; idx < numElem; idx++)
        voxelToPixel.at(idx).push_back(idx);

}

int main()
{
    foo();
    std::cout << "End" << std::endl;
    sleep(30);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这将留下大约4GB的内存,直到进程结束.

如果我们将for行更改为

for (unsigned int idx=0; idx < numElem; idx++)
    voxelToPixel.at(0).push_back(idx);
Run Code Online (Sandbox Code Playgroud)

记忆被释放了.

使用gcc-4.8Linux机器上.我们习惯于htop在具有100 GB RAM的计算机上跟踪内存使用情况.您将需要大约8 GB的RAM来运行代码.你能重现这个问题吗?关于为什么会发生这种情况的任何想法?

编辑:我们已经看到,这不会发生在Mac(任何一个gccclang).此外,在linux中,如果我们调用foo两次(但第三次再次发生),则释放内存.

c++ memory vector

22
推荐指数
1
解决办法
1123
查看次数

在不同的内存位置同时编写std :: deque是否是线程安全的?

std::deque<std::pair<CustomObj, int>>启动并发块时,我的大小不会改变.

并发块读取每个CustomObjdeque并设置int.

我可以保证deque不会改变大小因此它不会重新分配,并且每个线程只会访问deque的内存块而不是其他线程的内存块.

是否会导致未定义的行为同时读写?我应该把写作和阅读放在互斥区吗?

c++ multithreading openmp c++11

12
推荐指数
2
解决办法
534
查看次数

cmake -D <var>:<type> = <value>:<type>可以是什么?

-D <var>:<type>=<value>:创建一个cmake缓存条目.

好的,但可能<type>是什么?我见过BOOL,STRING,PATH,FILEPATH.那种类型还有什么?

cmake

11
推荐指数
1
解决办法
3400
查看次数

是否可以通过JNI将静态库链接到Java?

是否可以构建HelloWorld.lib并使用JNI将其加载到Java应用程序?或者它只适用于共享库?

我无法在JNI文档中找到明确的答案,没有提到"静态库".

java java-native-interface static-libraries

7
推荐指数
1
解决办法
6528
查看次数

如何在 cmake 上获取库的完整本机名称?

我需要将构建库的本机名称(libfoo.so 或 foo.dll)传递给 add_custom_command。

如何获取目标的完整库名称?

该属性LOCATION具有它,但具有完整路径。属性 OUTPUT_NAME 不返回任何内容。

cmake

7
推荐指数
1
解决办法
5012
查看次数

删除cmake上的默认标志

下列 CMakeLists.txt

 SET(CMAKE_CXX_FLAGS "/DWIN32")
 SET(CMAKE_C_FLAGS ${CMAKE_CXX_FLAGS})
 add_executable(hello hello.cpp)
Run Code Online (Sandbox Code Playgroud)

结束了

 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\x86_amd64\CL.exe /c /nologo /W1 /WX- /O2 /Ob2 /D WIN32 /D NDEBUG /D "CMAKE_INTDIR=\"Release\"" /D _MBCS /Gm- /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fo"hello.dir\Release\\" /Fd"C:/Users/monso/code/playground/cmakeworld/build/Release /hello.pdb" /Gd /TP /errorReport:queue ..\hello.cpp
Run Code Online (Sandbox Code Playgroud)

带有标志/c /nologo /W1 /WX- /O2 /Ob2 /D WIN32 /D NDEBUG.

如何删除它们以放入我自己的?设置CMAKE_CXX_FLAGS附加我放的任何标志(/w例如).虽然CMAKE_CXX_FLAGSset通话之前和之后打印确实会改变其值.

flags cmake visual-c++

7
推荐指数
1
解决办法
2639
查看次数

Cmake按特定顺序构建

我正在尝试用CMake创建一个JNI jar.为此,必须按照适当的顺序进行以下操作:

  1. 编译.class文件
  2. 生成.h标题
  3. 构建本机库
  4. 一切都好

哪里

  1. 已完成add_jar()(我更喜欢在custom_command)
  2. 完成了 add_custom_command(TARGET ...)
  3. 完成了 add_library()
  4. 完成add_custom_command(TARGET ...)(因为add_jar不支持-C选项)

如何确保遵循正确的订单?我有时会在第一次运行时遇到错误.

add_custom_command有一个POST/ PRE编译选项,但是add_jaradd_library没有.add_custom_command没有参数的那个TARGETDEPENDS选项,我应该使用吗?

有没有办法告诉add_library等待2.自定义命令运行?

java java-native-interface cmake

4
推荐指数
1
解决办法
3363
查看次数

将矢量<fooType> foo [num]移植到windows(无C99)

我们可以动态分配吗?

std::vector<fooType> foo[num];
Run Code Online (Sandbox Code Playgroud)

像这样?

 std::vector<sidType>* lSamplesPerClass = new vector<sidType>[nClasses];
 [...]
 delete [] lSamplesPerClass;
Run Code Online (Sandbox Code Playgroud)

c++ windows arrays stl vector

3
推荐指数
1
解决办法
69
查看次数

如何使用 g++47 允许 -z multidefs

如何告诉链接器g++允许多个符号定义(选择第一个出现)?

-z multidefs 允许多个符号定义。默认情况下,可重定位对象(.o 文件)之间出现的多个符号定义将导致致命错误条件。此选项抑制错误条件并允许采用第一个符号定义。此选项仅在指定了 -b svr4 选项时有效。

-zmuldefs不能识别该选项g++,也不能识别-z OPTION。什么是正确的参数?是否可以?

c++ linker flags g++ linker-flags

3
推荐指数
2
解决办法
1万
查看次数

在c ++中将文本文件读入std :: string的单行程序?

是否有单行将一个(不是很大的)文本文件的内容读入字符串?

我找到的最短的:

#include <string>
#include <fstream>
#include <streambuf>

std::ifstream t("file.txt");
std::string str((std::istreambuf_iterator<char>(t)),
                 std::istreambuf_iterator<char>());
Run Code Online (Sandbox Code Playgroud)

(对于大文件,请注意它是非常低效的解决方案,因为它必须在从流中读取的每个新字符之后重新分配缓冲区.)

credit:@Tyler McHenry将整个ASCII文件读入C++ std :: string

c++ string file-io lines-of-code ifstream

0
推荐指数
1
解决办法
3964
查看次数