我在试验
hboehm garbage collector
,现在只是试着
simple example
. 问题是,当我用Valgrind检查结果时,会出现很多“使用未初始化值”错误,讽刺的是,还会出现内存泄漏。
完整项目的一个最小的例子,再现问题。
cmake_minimum_required(VERSION 3.10)
include(ExternalProject)
ExternalProject_Add(
libatomic_ops
URL http://www.hboehm.info/gc/gc_source/libatomic_ops-7.6.2.tar.gz
CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND ""
)
ExternalProject_Get_Property(libatomic_ops SOURCE_DIR)
set(libatomic_ops_SOURCE_DIR "${SOURCE_DIR}")
ExternalProject_Add(
hboehm_gc
URL http://www.hboehm.info/gc/gc_source/gc-7.6.4.tar.gz
DEPENDS libatomic_ops
BUILD_IN_SOURCE TRUE
PATCH_COMMAND "${CMAKE_COMMAND}" -E copy_directory "${libatomic_ops_SOURCE_DIR}" "<SOURCE_DIR>/libatomic_ops"
CONFIGURE_COMMAND ./configure "--prefix=<INSTALL_DIR>"
BUILD_COMMAND make
INSTALL_COMMAND make install
)
ExternalProject_Get_Property(hboehm_gc INSTALL_DIR)
set(hboehm_gc_INSTALL_DIR "${INSTALL_DIR}")
ExternalProject_Add(
main DEPENDS hboehm_gc
DOWNLOAD_COMMAND ""
SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/project"
BUILD_ALWAYS TRUE
CMAKE_ARGS "-DCMAKE_PREFIX_PATH=${hboehm_gc_INSTALL_DIR}"
INSTALL_COMMAND ""
TEST_COMMAND "${CMAKE_CTEST_COMMAND}" --verbose
)
cmake_minimum_required(VERSION 3.10)
find_path(HBOEHM_GC_INSTALL_DIR include/gc.h)
find_program(VALGRIND_COMMAND valgrind)
add_executable(main src/main.cpp)
target_compile_features(main PRIVATE cxx_std_14)
target_link_libraries(main PRIVATE "${HBOEHM_GC_INSTALL_DIR}/lib/libgc.a" pthread)
target_include_directories(main PRIVATE "${HBOEHM_GC_INSTALL_DIR}/include")
enable_testing()
add_test(NAME valgrind COMMAND "${VALGRIND_COMMAND}" "$<TARGET_FILE:main>")
set_tests_properties(
valgrind PROPERTIES
PASS_REGULAR_EXPRESSION "ERROR SUMMARY: 0 errors from 0 contexts"
)
#include <cassert>
#include <iostream>
#include <gc.h>
int main() {
int i;
GC_INIT();
for (i = 0; i < 10000000; ++i)
{
int **p = (int **) GC_MALLOC(sizeof(int *));
int *q = (int *) GC_MALLOC_ATOMIC(sizeof(int));
assert(*p == 0);
*p = (int *) GC_REALLOC(q, 2 * sizeof(int));
if (i % 100000 == 0)
std::cout << "Heap size = " << GC_get_heap_size() << "\n";
}
return 0;
}
只需要:
mkdir build
cd build
cmake ..
make
它将下载hboehm\u gc和依赖项,构建项目,并运行valgrind。我希望我只是在某种程度上误用了图书馆,但我不确定我做错了什么。感谢您的帮助。