繁体   English   中英

将向量复制到类的向量成员中

[英]Copying a vector into a vector member of a class

我有一个带有向量成员的类。 我有访问器来设置/获取向量的值。

typedef vector<int> vint_t;

class MyVector {
  public:
    MyVector(const vint_t & v) : _vint(v) {};

    size_t set(const vint_t & v) {
        _vint = v;  // Will this leak memory in the old location of _vint?
        const size_t n = v.size();
        return n;
    }

    const vint_t & get() {
        return _vint;
    }

  private:
    vint_t _vint;
};

除了set正确设置_vint的内容(用下面的代码验证, operator<<适当重载)之外,还会在_vint的旧位置set泄漏内存吗?

vint_t v1 = { 1, 4, 10, 2 };
MyVector mv1(v1);
cout << mv1.get() << endl;
vint_t v3 = { 8, 1, 4, 10, 2 };
mv1.set(v3);
cout << mv1.get() << endl;

,它不会泄漏内存,这是因为标准容器的编程很合理。 在这种情况下,赋值只是调用“=”右侧向量的每个元素的复制构造函数,并将其复制到“=”左侧的向量上。 在这种赋值之前,“=”左边的向量调用所有对象的析构函数。

因此,如果发生内存泄漏,那是由于向量模板的对象参数泄漏。

会在_vint 的旧位置设置泄漏内存吗?

不会_vint的内存位置一_vint并没有改变。 此外, std::vector的赋值运算符未指定为泄漏内存(任何标准容器的任何操作也未指定)。

当然,如果存储在向量中的对象是某个资源的句柄,那么如果在不释放资源的情况下删除句柄,这些对象就会泄漏。 在您的示例中,您使用了任意整数值,因此它们似乎不是资源句柄。

size_t set(const vint_t & v) {
    _vint = v;  // Will this leak memory in the old location of _vint?
}

除非std::vector被严重破坏,否则这不可能泄漏内存。 一般在a = b; 对象a仍然是同一个对象。 只有值被复制。 您正在调用未损坏的std::vector::operator=

由于_vint是一个对象,它不会“改变位置”。 指针也不会改变位置,但如果您通过mallocnew分配额外的内存,则会导致内存泄漏。

但是,在您的示例中,您既不使用指针也不分配新内存。 如果您不分配新内存,则不会有内存泄漏,您将只使用必要的内存,并且在退出作用域(如函数)时所有这些都将被考虑在内。 这不考虑无限嵌套的范围,例如递归函数,但您也没有使用它们。

关键是,您正在处理一个对象并为其分配一个值。 该值已更改,但没有“旧位置”。 这里没有内存泄漏。

_vint = v

这是一个复制赋值操作,所以v的内容被复制_vint ,但你没有删除或创建任何对象,所以没有可能的内存泄漏。 另外,请记住,内存泄漏主要发生在使用指针时,而实际上并非如此。

这不是问题的答案,但我确实在这段代码中看到了两个危险。

第一的

size_t set(const vint_t & v) {
    _vint = v;  // Will this leak memory in the old location of _vint?
}

该函数返回size_t但没有 return 语句。 我希望编译器会抱怨这个。 该函数可能应该返回void

const vint_t & get() {
    return _vint;
}

请谨慎使用。 您需要注意MyVector对象的生命周期不短于get返回的任何引用。 例如,一个简短的人为例子:

MyVector* mvp = new MyVector(v1);
const vint_t& vref = mvp->get();
delete mvp;
// ...
std::cout << vref << '\n'; // oh dear

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM