2 个 gtest 文件中包含的静态内联关联集合引发读取访问冲突
static inline associative collection included in 2 gtest files throws read access violation
我有一个非常简单的 class,它带有一个静态内联成员变量,如果它包含在 1 个以上的测试文件中,就会抛出“读取访问冲突”。在所有测试通过后,在析构函数中抛出错误。它也只出现在调试版本中。我怀疑它不止一次试图删除成员变量。
请注意,下面的示例没有实际测试,因为使用和不使用测试功能都会出现错误。据我所知,任何关联集合(std::map、std::set、boost::ptree、std::unordered_map 等)都会发生这种情况。它不会发生在 std::array、std::vector 等文字或序列容器中
我正在使用 Visual Studio 2017 - 15.9.33
如何在保持静态内联的同时解决此错误?
Foo.h
#pragma once
#include <map>
class Foo
{
static inline std::map<int, int> my_map;
}
EmptyOneTest.cpp
#include "gtest/gtest.h"
#include "Foo.h"
TestTwo.cpp
#include "gtest/gtest.h"
#include "Foo.h"
你对两次调用析构函数的分析可能是正确的。它不会发生在向量和数组中,因为它们自己的析构函数是微不足道的,而且它不会发生在发布版本中,因为编译器优化了未使用对象的构造和破坏。
您似乎发现了 VS 编译器的一个令人不快的限制,可能需要寻求解决方法,例如迈耶的单身人士:
static inline std::map<int,int>& my_map() {
static std::map<int,int> res;
return res;
}
我有一个非常简单的 class,它带有一个静态内联成员变量,如果它包含在 1 个以上的测试文件中,就会抛出“读取访问冲突”。在所有测试通过后,在析构函数中抛出错误。它也只出现在调试版本中。我怀疑它不止一次试图删除成员变量。
请注意,下面的示例没有实际测试,因为使用和不使用测试功能都会出现错误。据我所知,任何关联集合(std::map、std::set、boost::ptree、std::unordered_map 等)都会发生这种情况。它不会发生在 std::array、std::vector 等文字或序列容器中
我正在使用 Visual Studio 2017 - 15.9.33
如何在保持静态内联的同时解决此错误?
Foo.h
#pragma once
#include <map>
class Foo
{
static inline std::map<int, int> my_map;
}
EmptyOneTest.cpp
#include "gtest/gtest.h"
#include "Foo.h"
TestTwo.cpp
#include "gtest/gtest.h"
#include "Foo.h"
你对两次调用析构函数的分析可能是正确的。它不会发生在向量和数组中,因为它们自己的析构函数是微不足道的,而且它不会发生在发布版本中,因为编译器优化了未使用对象的构造和破坏。
您似乎发现了 VS 编译器的一个令人不快的限制,可能需要寻求解决方法,例如迈耶的单身人士:
static inline std::map<int,int>& my_map() {
static std::map<int,int> res;
return res;
}