C ++,对象数组,自定义它们存储在内存中的位置

时间:2016-06-24 19:53:51

标签: c++ arrays pointers memory-management allocation

目前我正在处理我必须扩展的现有项目(DLL)。

对于通过DLL的传输,我有一个结构,例如' ExternEntry' 以及传递数组的结构。

struct ExternEntry
{
  unsigned int MyInt;
  const wchar_t* Text;
}

struct ExternEntries
{
  const ExternEntry* Data;
  const unsigned int Length;

  ExternEntries(const ExternEntry* ptr, const unsigned int size)
    : Data(ptr)
    , Length(size);
  {
  }
}

在现有的项目架构中,这将是第一次将数组传递给DLL调用者。所以现有的体系结构不允许数组,如果将结构传递给调用者,通常会有一个包装器结构(因为它们的str指针)。

在DLL内部,我需要包装ExternEntry,以便有一个有效的文本指针。

struct InternEntry
{
  ExternEntry Data;
  std::wstring Text;
  inline const ExternEntry* operator&() const { return& Data }
  UpdateText() { Data.Text = Text.c_str(); }      
}

struct InternEntries
{
  std::vector<InternEntry> Data;

  operator ExternEntries() const
  {
    return ExternEntries(Data.data()->operator&(), Data.size());
  }
}

所以问题是,当调用者收到ExternEntries并再次创建一个向量时:

auto container = DllFuncReturnInternEntries(); // returns ExternEntries

std::vector<ExternEntry> v(container.Data, container.Data + container.Length);

第一个元素有效。所有其他元素都指向错误的内存,因为在内存中,InternEntry(带有wstring Text)存储在下一个InternEntry之间。

也许我错误的原因是它无法正常工作。

[Data][std::wstring][Data][std::wstring][Data][std::wstring]

来电者知道[数据]的大小 因此,向量正在执行以下操作:

[Data][std::wstring][Data][std::wstring][Data][std::wstring] 
  |       |       |
 Get     Get     Get

而不是

[Data][std::wstring][Data][std::wstring][Data][std::wstring]
  |                   |                   |
 Get                 Get                 Get

我是否有可能自定义向量如何在内存中存储InternEntry对象? 像数据,数据,数据..其他地方wstring,wstring,wstring

我希望我能很好地解释我的问题

0 个答案:

没有答案