如何保持**的数据加倍?

时间:2016-06-16 12:29:29

标签: c++ pointers memory double access-violation

让我说一个有指针成员双指针的类:

public:
    double **pSamples;

在一个成员类函数中,有时候,我使用RAII习语填充这个"矩阵":

void LoadWave() {
    vector<vector<double>> samplesContainer(mWaveNumChannels, vector<double>(mWaveReader.GetSize()));
    vector<double*> ptrs(mWaveNumChannels);
    for (size_t i = 0; i != mWaveNumChannels; ++i) {
        ptrs[i] = samplesContainer[i].data();
    }

    pWaveSamples = ptrs.data();
    mWaveReader.ReadDoublesNI(pWaveSamples, 0, mWaveReader.GetSize());
}

一切都好!但是现在,如果稍后在另一个函数上我尝试迭代/管理指针的指针,我就会遇到访问冲突。

我认为因为当LoadWave()结束时向量释放/破坏?

您如何保留数据/矩阵?所以我以后可以重复使用它?

1 个答案:

答案 0 :(得分:2)

您生成一个悬空指针,当然会导致访问冲突。 C ++解决方案是避免使用原始指针,但是让内存通过某种方法进行管理,最好使用标准库容器。

一种懒惰的方法是

class myclass 
{
  std::vector<double > samplesContainer;
  std::vector<double*> samples;
  void setPter(std::size_t num_samples, std::size_t smaple_size)
  {
    samplesContainer.resize(num_samples*smaple_size);
    samples.resize(num_samples)
    for(std::size_t n=0; n!=num_samples, ++n)
      samples[n] = &(samplesContainer[n*smaple_size])
  }
  const double**psample() const { return samples.data(); }
  /* ... */
};

虽然1D向量的2D阵列自适应(不需要/提供double**)实现起来相当简单。

从您的评论中,我怀疑您使用的框架工作不是C ++或写得不好:一个好的C ++界面不会使用double**(甚至double* ),无论效率如何考虑。