【问题标题】:c++ : An array of the pointer float type with dynamic sizec ++:具有动态大小的指针浮点类型数组
【发布时间】:2018-09-24 13:31:11
【问题描述】:

这是正确的吗?

stereoBuffer 将是一个指针浮点类型的数组,大小为 mixQty(即 2);

// C++ in Header File

float **stereoBuffer;

// in cpp file inside a function of init

mixQty = 2; // this will be passed in function

stereoBuffer = new float*[mixQty];

for (int i = 0; i < mixQty; ++i) {
    stereoBuffer[i] = (float *)malloc(samplerate * 2 * sizeof(float) + 32768);
}

帮助和详细回答将获得奖励。

【问题讨论】:

  • 是 C 还是 C++?在 C++ 中,您应该避免使用 malloc(以及现代 C++ 中的 new)。
  • 为什么要混合使用 new (C++) 和 malloc (C) ?
  • 在 C++ 中更喜欢 std::vector&lt;std::vector&lt;float&gt;&gt; 而不是 float**
  • @KathanShah malloc 在 C 中使用,并且在 C++ 中支持主要是为了兼容性。在引入智能指针之前,new 在 C++ 中用作替代方案。现在,std::make_uniquestd::make_shared 是动态分配的首选。虽然在这种情况下,只需使用 std::vector 就可以了,没有理由手动分配内存。
  • @KathanShah 可以,您只需将指向所有子向量的指针存储在 vector&lt;float*&gt; 中,然后将该向量的 data 传递给函数。

标签: c++ pointers


【解决方案1】:

这对吗?

没有。混合newmalloc() 不是一个好主意。

如果您必须使用动态内存分配,请阅读以下内容:How do I declare a 2d array in C++ using new?

否则,请使用std::vector

【讨论】:

  • 贴出的代码是正确的,不是好主意不代表不正确。
  • @KathanShah 由于您似乎分配了浮点数和字节的混合,我认为您必须使用新的字符 []。 stereoBuffer[i] = (float *)new char[samplerate * 2 * sizeof(float) + 32768]; 但这与使用 malloc 并没有太大区别,所以在这种不寻常的情况下,malloc 可能是可以的。
  • @john 您的建议违反了严格的别名和对象模型。你有一个指向char 的指针,而不是float。该存储中实际上没有任何floats,因此您不能合法地将其用作floats 的数组。
  • @Cheersandhth.-Alf 这是标准要求的:timsong-cpp.github.io/cppwp/intro.object#1
  • @Cheersandhth.-Alf c++ 开发人员 无论如何都要遵守标准的每一个字母。否则,他们就不是用 c++ 编程。
【解决方案2】:

stereoBuffer 会是指针浮点类型的数组吗

它将是(指向第一个元素的指针)类型为浮点型的数组。

这个数组的每个元素都是一个指向浮点数组第一个元素的指针。

正如 gsamaras 所说,像这样混合 newmalloc 是一种糟糕的做法。正确解除分配是不必要的困难,并且没有错误检查。您至少可以使用 std::vector&lt;std::unique_ptr&lt;float[]&gt;&gt; 并让它为您正确处理释放。

using StereoBuffer = std::vector<std::unique_ptr<float[]>>;

StereoBuffer allocateStereoBuffer(size_t mixQty, size_t samplerate)
{
  StereoBuffer buf(mixQty);

  for (size_t i = 0; i < mixQty; ++i) {
    buf[i] = make_unique<float[]>(samplerate * 2 * 32768); // ?
  }
  return buf;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-15
    • 2017-11-20
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 2018-05-02
    相关资源
    最近更新 更多