2013-03-12 120 views
0

所以这里是我遇到的问题。指向std :: vector

我有一个指向std :: vector的指针。所以在初始化指针之后,我不会向矢量添加任何项目,也不会删除任何项目。然而,在我的代码中的某个点,我的std :: vector移动了位置,最后我得到了一个悬挂指针。这似乎是随机发生的,尽管我在制作指针之后从未触摸过这个矢量。我花了一段时间调试了这个,以解决这个问题。有没有办法保证我的std :: vector不会改变内存位置?或者是否有一个指向矢量的指针是个不错的主意。

+0

请张贴一些代码并解释您在调试过程中发现的内容。 std :: vector移动似乎不太可能。相反,指针会更改为指向无效的内存位置。为了帮助您找出原因,我们需要更多信息。 – 2013-03-12 18:44:21

+2

你有一个指向'std :: vector'的指针,还是你有一个指向'std :: vector'内的元素的指针? – Caesar 2013-03-12 18:44:22

+0

介意显示一些代码?你为什么要使用指向矢量的指针?它可以用矢量矢量来代替吗? – taocp 2013-03-12 18:45:30

回答

1

或者它只是一个坏主意有一个指向矢量的指针?

一般来说,我认为使用原始指针来控制对象的生命周期是一个坏主意。不要使用原始指针和自动内存管理,请尝试使用具有适当所有权语义的智能指针(std::shared_ptr<>std::unique_ptr<>)。使用原始指针仅用于观察指针(如果您希望能够在运行时验证它们是否悬挂,请使用weak_ptr<>)。

此外,在许多情况下,您可能会意识到您根本不需要指针。在这种情况下,只需使用一个带有自动存储的对象,由于移动语义,这个对象可以高效地在C++ 11中移动或传递/返回值。

1

这似乎发生随机

不,不。只要它保持在范围内,它具有相同的地址。可能发生的情况是矢量超出了范围,并且由于它被自动分配(听起来像),它在那个时候被破坏。你可以做的是在堆上分配的载体(例如int S):

std::vector<int>* pv = new std::vector<int>(); 

然后,你将不会有这个问题。然而,你必须记住pv超出范围,否则你会得到一个内存泄漏之前

delete vp; 

明确delete它。