4

所有我有一个遗留代码,它在草稿中做了这样的事情:

// sadly I have to use this structure
struct LegacyStruct {
  int* values;
}
LegacyStruct* LgStr;
....
    std::vector<int> vec;
    // fill vector in some way here  

    size_t sz = vec.size();
    LgStr->values = new int[sz];
    std::copy(vec.begin(), vec.end(), &LgStr->values[0]);

vec 可能很大,我需要避免将其复制到 int*。有没有办法做到这一点?我试过以下:

// type of new operator explained in More Effective C++
LgStr->values = new (&vec[0])int[vec.size()];

好的,values指向 vec 内部数组的开头,但是当 vec 超出范围时它被破坏了。但我必须保持它..

&vec[0] = nullptr; // does not compile of course

所以问题是:在这种情况下是否可以应用移动语义?或者也许是其他一些技巧?

4

2 回答 2

6

简短的回答是不,没有任何方法可以将 avector缓冲区的所有权转移到vector.

我认为你最好的选择是通过使用包装来确保vectorjust 不会死:

class LegacyStructWrapper : private boost::noncopyable  // Or declare private copy constructor/copy assignment or use `= delete` in C++11.
{
private:
    std::vector<int> vec_;
    LegacyStruct wrapped_;
}

然后任何时候你需要使用values,只需将其分配给&vec_[0]. 如果/直到您向其中添加更多项目,这将保持不变vector(因此您必须小心确保矢量调整大小不会导致问题)。

于 2012-06-19T14:20:47.360 回答
4

是的,你可以这样做——用一个小技巧:

struct LegacyStruct {
  std::vector<int> backingStore;
  int* values;
  LegacyStruct(std::vector<int>& aSource) {
    // Steal memory
    aSource.swap(backingStore);
    // Set pointer
    values = &backingStore[0];
  };
}

vector.swap操作不会复制整数。

于 2012-06-19T14:25:44.407 回答