欢迎访问我的博客首页。
1. 测试程序
我们使用下面的代码测试内存。
void f5() {
int *p = new int(7);
delete p;
*p = 20;
}
int main(int argc, char **argv) {
f5();
cout << "All tests passed" << endl;
}
2. 使用编译选项测试
2.1 配置文件
配置文件 CMakeLists.txt 内容如下。
cmake_minimum_required(VERSION 3.5.1)
project(cc)
SET(CMAKE_BUILD_TYPE Debug)
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb -Wno-attributes -Wno-unused")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall -Wno-attributes")
find_program(MEMORYCHECK_COMMAND valgrind)
set(MEMORYCHECK_COMMAND_OPTIONS "--trace-children=yes --leak-check=full")
include(CTest)
enable_testing()
add_executable(${PROJECT_NAME}
main.cc
)
add_test(NAME test1
COMMAND ${PROJECT_NAME}
)
set_tests_properties(test1 PROPERTIES
PASS_REGULAR_EXPRESSION "All tests passed"
FAIL_REGULAR_EXPRESSION "Some tests failed"
)
include(Dart)
第 4 行指定编译类型。第 5 行指定编译选项,参数 -Wno-attributes 可以让 valgrind 告诉我们内存泄漏的行号。
第 8 至 11 行启用 valgrind 测试。
第 16 至第 18 行测试可执行程序 ${PROJECT_NAME}。第 19 至 22 行在该测试中检查程序输出。
2.2 执行测试
先使用 cmake 和 make 命令编译,再使用 ctest -T memcheck 命令测试。命令行会输出对程序输出内容的检查结果和对内存泄漏的检测结果的简要内容。详细的内存泄漏情况在编译输出目录下的 Testing/Temporary/MemoryChecker.*.log 中。
3. 直接测试
直接测试时只需在配置文件 CMakeLists.txt 中指定编译和优化方式。
cmake_minimum_required(VERSION 3.5.1)
project(cc)
SET(CMAKE_BUILD_TYPE Debug)
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb -Wno-attributes -Wno-unused")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall -Wno-attributes")
add_executable(${PROJECT_NAME}
main.cc
)
先使用 cmake 和 make 命令编译,再使用下面的任意一个命令测试。
valgrind --leak-check=full ./cc
valgrind --tool=memcheck ./cc
4. 参考
- 内存检查工具 valgrind,优快云,2024。