【问题标题】:Pointer to Vector Memory Loss指向向量内存丢失的指针
【发布时间】:2015-12-08 07:57:21
【问题描述】:

我的指针向量有问题... 我知道问题可能出在哪里:

当我创建一个指向向量的指针时,指针会在堆上保留向量的大小。所以这基本上意味着,指针现在指向向量的内存,里面没有任何东西......当我现在调整或推回向量时,指针现在仍然指向向量的整个内存还是只指向具有一开始就分配了?

我也想知道,是否有一些技巧可以解决这个问题(如果我认为是真的)。 “vector.reserve(n)”是实现这一点的方法吗?或者我可以做些什么来将指针内存地址覆盖到初始化后的向量?

【问题讨论】:

  • 这是怎么回事?
  • 你真的需要一个指向堆上向量的指针吗?你不太可能这样做。
  • 您的意思是“指向向量的指针”还是“指向向量中第一个元素的指针”?也许显示一些代码。
  • 我不想用代码让任何人不知所措,所以我这样说:我有一个指针 = 新向量,然后我将对象推入这个向量。对象有一个函数,它返回我在初始化对象时设置的字符。现在,当我尝试读出那个向量时,我得到了很多奇怪的字符。所以我想,指针的长度也没有调整大小,所以他现在选择尝试读出向量范围之外的内容。
  • @RIJIK:那代码就坏了。没有看到,我们无法帮助您。当然,现在这将是一个完全不同的问题。

标签: c++ pointers memory vector heap-memory


【解决方案1】:

“当我创建一个指向向量的指针时,指针会在堆上保留向量的大小。

不,它没有! 当你创建一个指向向量的指针时,你就有了一个指针。而已。它还没有指向任何东西,当然也没有为你保留任何“堆内存”。

您仍然需要实际创建将被指向的向量。

std::vector<int>* ptr1;                            // just a pointer;
ptr1 = new std::vector<int>();                     // there we go;
delete ptr1;                                       // don't forget this;

auto ptr2 = std::make_shared<std::vector<int>>();  // alternatively...

您知道,您很少需要动态分配容器。通常你只想以通常的方式构建它:

std::vector<int> v;

就是这样。不需要指针。


当我现在调整向量的大小或推回向量时,指针现在仍会指向向量的整个内存还是仅指向一开始分配的内存?

无论您如何构建/分配它,向量本身都不会自发移动(只有它在内部为您管理的动态内存),因此您无需担心这一点。


我也想知道,如果有一些技巧可以解决这个问题

不需要,因为没有什么可修复的。


“vector.reserve(n)”是实现这个的方法吗?

理论上,如果这一个问题(它不是)那么,是的,这可能构成解决方案的基础。

【讨论】:

    【解决方案2】:

    Vector 是一个类,它使用堆中的连续内存块具有指向向量元素的内部指针。对于所有保留向量的元素来说足够长(容量()方法) 因此,如果您创建向量(在本地范围的堆栈或堆中 - 没关系)它会创建此布局

    [ vector   [ ptr-to-data ] ] --> HEAP: [ 1 ][ 2 ][ 3 ]
    
    vector<int> v1(3); // whole vector instance in the stack 
    vector<int> *pv2 = new vector<int>(3); // pointer to vector in the heap
    

    这两个向量实例中的每一个都有其指向堆中元素的指针

    Vector 在内部管理其指向数据的指针。 当你 push_back() 的元素多于当前的 .capacty() 时,它将重新分配新的连续内存块并复制构造或将所有旧元素移动到这个新块。

    【讨论】:

    • 那么向量的所有内存都在堆上了吗?!这意味着,我可以让它比数组大很多而不用指向它吗?我已经在我的问题的评论中写下了我的问题,你能告诉我我的情况有什么问题吗?
    • 非常感谢您的回答!它给了我解决问题所需的知识!对于那些有兴趣知道我做错了什么的人:由于 Vector 在调整大小时会重新定位其所有内存(因为他使用的是指针——>有点像我一开始怀疑的那样),我不应该为它的元素分配指针。向量就像在堆中移动的东西,所以每当向量再次调整大小(移动)时,必须重新分配指向其元素的指针。非常感谢!
    • 因此,与您在问题中声称的不同,您有指向 elements 的指针。完全不同。
    • 我不想用代码页杀死你,所以我试图只获得主要方面。也许它太短了。对不起
    • @RIJIK 是的,您正确理解了一切:您不能存储指向向量元素的指针。因为向量的内部数组(堆内存块)可以(并且通常会)在调整大小事件时移动
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多