c++ - 两个对象似乎共享同一个地址

标签 c++ visual-studio templates

我使用的是 Visual Studio Ultimate 2013 Preview,Windows 7。

我使用 CRTP 能够方便地将任何类型的对象推送到单独的 vector 中。

然而,结果很奇怪。您会看到我有两个类,AB,它们派生自 Container。使用 T* PushOne(),一个新实例被插入一个静态 vector ,它的地址被返回以供使用。

由于某些原因,A 类的第一个实例化对象和 B 类的第一个实例化对象似乎共享相同的地址。

代码如下:

template <typename T>
class Container{
public:
    static std::vector<T> elements;

    static T* PushOne(){
        //Push a new T object into the vector
        elements.push_back( T{} );
        //Print out its address
        std::cout << "Make " << typeid(T).name() << " at " << &elements[elements.size() - 1] << "\n";
        //Return its address.
        return &elements[elements.size() - 1];
    }
};

template <typename T> 
std::vector<T> Container<T>::elements;

class A : public Container<A>{
};

class B : public Container<B>{
};

int main(int argc, char** args){
    std::cout << "First addresses:\n";

    //a and c are assigned the address
    auto a = Container<A>::PushOne();
    auto b = Container<A>::PushOne(); //Problem gone if this is commented
    auto c = Container<B>::PushOne();

    std::cout << "\nLater addresses:\n";
    std::cout   << &Container<A>::elements[0] << "\n" 
                << &Container<A>::elements[1] << "\n" 
                << &Container<B>::elements[0] << "\n";

    std::cin.get();
}

在我的机器上运行一次的输出:

First addresses:
Make class A at 00700350
Make class A at 006FA929
Make class B at 00700350

Later addresses:
006FA928
006FA929
00700350

如您所见,第一个和最后一个条目(分别存储在变量 ab 中)首先打印相同的地址。

当我第二次打印地址时,第一次 A* 得到了不同的结果。

我总是得到相同的结果,除非我注释掉 auto b = ... 行。如果我这样做,ab 会被分配不同的地址。

最佳答案

第二个 push_back/PushOne 导致在您的 std::vector<A> 上重新分配增长它,这样现在第一个 A 元素不再位于 00700350 .

你的 Later addresses打印输出证实了这一点。

关于c++ - 两个对象似乎共享同一个地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19322702/

相关文章:

c# - VS2010 中没有智能感知

C++Builder XE2 或 Visual Studio 11,来自 VB 应用程序

c++ - `const` 作为移动构造函数的模板参数的效果

c++ - Uncrustify:删除空间打开/关闭 block

C++ 应用程序不会终止

C# Entityframework - 如何将导航属性从 HashSet 转换为 SortedSet

c++ - 替换失败

c++ - 编译器模板实现会引入循环依赖吗?

C++ 和图形

c++ - 错误 C2228 : left of '.values' must have class/struct/union