C++ 如果从自定义分配器调用,则std::cout不会输出(Visual Studio 2019)

C++ 如果从自定义分配器调用,则std::cout不会输出(Visual Studio 2019),c++,visual-studio-2019,C++,Visual Studio 2019,我正在尝试解决如何使用自定义分配器。我已经编写了一个从std::allocator继承的基本分配器,并且正在使用std::cout尝试跟踪它的执行。代码如下: #include <vector> #include <iostream> struct myIntAllocator : std::allocator<int> { int* allocate(size_t size) { std::cout << "bar

我正在尝试解决如何使用自定义分配器。我已经编写了一个从std::allocator继承的基本分配器,并且正在使用std::cout尝试跟踪它的执行。代码如下:

#include <vector>
#include <iostream>
struct myIntAllocator : std::allocator<int>
{
    int* allocate(size_t size)
    {
        std::cout << "bar" << std::endl;
        return new int[size];
    }
};
int main()
{
    std::cout << "foo" << std::endl;
    std::vector<int, myIntAllocator> ints;
    ints.push_back(1);
}
我希望它也能输出
bar
,但这并没有出现

我是否错过了让
std::cout
以这种方式工作的魔力?还是我误解了如何使用分配器

我正在Visual Studio 2019中使用MSVC v142,编译器优化已关闭。

您问:

我是否错过了让std::无法以这种方式工作的魔力?或者 我误解了如何使用分配器


在某种程度上,是的-通常您不想继承和重载分配器,因为这只会使事情变得更混乱,并使您暴露于切片/上转换。另一点是,据我们所知,向量或分配器可能也有一些我们不知道的实现细节。逻辑上的解释仍然是你的函数没有被调用。

这就是我所担心的。你知道std::cout是否会根据上下文“忽略”某些事情吗?我已经关闭了具有相同结果的编译器优化项来处理
clang
,只有
gcc
会产生所描述的行为。可能是分配没有被调用吗?@darune这是可能的,但我不确定如何调试它。如果它确实没有被调用,那么为什么它根据@lubgr在
clang
中工作,而不是在
gcc
MSVC
中工作?正如副本所解释的,您没有正确地实现
重新绑定
。从
std::allocator
派生隐藏了这个bug,这也是您不应该这么做的原因之一。(尝试添加
template struct rebind{typedef myIntAllocator other;};
,它会工作。)是
std::allocator
具有他不知道的实现细节。“通常你不想继承和重载分配器”-你真的想说“不”而不是“做”@RemyLebeau是的,确实,我现在已经解决了这个问题
foo