繁体   English   中英

传递参数的C ++内存初始化

[英]c++ memory initialization for passed arguments

我正在写一个c ++程序。 我正在解析文件并初始化结构。 我有一个要初始化的数组,但我必须从文件中读取数组的大小。 我想在一个函数中读取数组长度和初始化数组。 如果我将数组指针传递给另一个函数并执行一个新的函数,则当函数返回时,指针将被销毁,并且无法看到初始化的值。 这是预期的还是我错过了什么? 我该如何克服这个问题?

您可以通过忘记有关手动数组,原始指针传递*和new所有内容来克服这一问题。 这是C ++,而不是1991。因此,典型的解决方案可能是:

#include <vector>
#include <cstdint>
#include <istream>

std::vector<uint32_t> read_data(std::istream & is)
{
  uint32_t len;
  is.read(reinterpret_cast<char*>(&len), sizeof(uint32_t));

  std::vector<uint32_t> result(len);
  for (uint32_t i = 0; i != len; ++i)
  {
    is.read(reinterpret_cast<char*>(&result[i]), sizeof(uint32_t));
  }

  return result;
}

(在高质量代码中, read命令将被条件包围,并且可能会引发异常来处理错误。)

后来:

#include "int_reader.hpp"
#include <fstream>
#include <iostream>

int main()
{
  std::ifstream infile("thedata.bin", std::ios::binary);
  std::vector<uint32_t> data = read_data(infile);

  std::cout << "We read " << data.size() << " integers.\n";
}

*)通用代码C ++中唯一在I / O操作中使用的原始指针是char* ,如该代码所示。 C ++将char定义为机器的基本数据单元类型,并且I / O以char为单位进行。

调用new之前没有数组指针。 因此,您不可能将其传递给函数。

您可能正在做的是将数组指针的未初始化的垃圾值传递给函数。 该函数使用从new返回的正确指针覆盖该垃圾值的副本,但是原始函数再也看不到该指针。

您需要向函数传递一个指向该指针的指针。 然后,当它调用new ,它可以使用指向该指针的指针来更新调用者的指针。 像这样:

void SomeFunction(void **SomePointer)
{
    (*SomePointer) = malloc(1024);
}


void *MyPointer;
SomeFunction(&MyPointer);

您必须将指针传递给指针,才能让函数为您分配指针

void allocateArrayOfT(T** objArray, size_t len) {
    *objArray = new T[len];
}

您可以致电:

T* arrayPtr;
allocateArrayOfT(&arrayPtr, len);

暂无
暂无

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

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