C++ 如何保存**double的数据?

C++ 如何保存**double的数据?,c++,pointers,memory,double,access-violation,C++,Pointers,Memory,Double,Access Violation,假设我有一个类,它有一个指针成员的双指针: public: double **pSamples; 在成员类函数中,有时我会使用RAII习惯用法填充此“矩阵”: void LoadWave() { vector<vector<double>> samplesContainer(mWaveNumChannels, vector<double>(mWaveReader.GetSize())); vector<double*> p

假设我有一个类,它有一个指针成员的双指针:

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());
}
void LoadWave(){
vector samplesContainer(mWaveNumChannels,vector(mWaveReader.GetSize());
向量ptr(mWaveNumChannels);
对于(大小i=0;i!=mWavenumChannel;++i){
ptrs[i]=samplescanner[i].data();
}
pWaveSamples=ptrs.data();
mWaveReader.ReadDoublesNI(pWaveSamples,0,mWaveReader.GetSize());
}
一切都好!但是现在,如果稍后在另一个函数中我尝试迭代/管理指针的指针,我会遇到访问冲突

我想是因为LoadWave()结束时向量释放/销毁对吗


您将如何保存这些数据/矩阵?所以我以后可以重新使用它?

您生成了一个悬空指针,这当然会导致访问冲突。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(); }
  /* ... */
};
class-myclass
{
std::向量样本容器;
std::载体样本;
无效设置器(标准::大小\数量\样本,标准::大小\样本大小)
{
samplesContainer.resize(样本数*样本大小);
示例。调整大小(num_示例)
对于(std::size\u t n=0;n!=num\u样本,++n)
样本[n]=&(样本容器[n*s样本大小])
}
常量double**psample()常量{return samples.data();}
/* ... */
};
尽管1D矢量的2D阵列自适应(不需要/不提供
双**
)实现起来相当简单


<>从你的评论中,我怀疑你使用的框架不是C++,或者写得不好:一个好的C++接口不会使用<代码>双*< /C>(或者甚至<代码>双*<代码>,不管效率如何考虑。如果是RAII,数组将在对象的构造函数中分配,在对象的析构函数中销毁,并在赋值操作符中进行适当管理;请更新您的代码,您的填充代码当前不填充
pSamples
。将
ptrs
samplescanner
作为类成员,而不是
pSamples
@paizza为什么?指向指针的指针不是容器。它也不是容器视图
pSamples
既不拥有任何数据,也不知道它应该观察的数据数组的大小。请使用适当的语义:如果
pSamples
应该拥有其数据的生存期,请使用
std::vector
或其他RAII容器。如果
pSamples
应该只对外部拥有的数据进行迭代,那么将
pSamples
设置为一个合适的“指针和大小”结构,如
gsl::span
,并确保数据比
pSamples
@paizza更持久,你有证据证明
std::vector
更慢吗?根据设计,除非您经常使用
push_-back
insert
std::vector
将只执行与手动编写的操作相同的操作:
new[]
,从
begin()
迭代到
end()
,然后在适当的时候执行
delete[]
std::vector
中的数据保证是连续的,这意味着它是缓存友好的,并且基本上是拥有数据的最有效方式。如果您的代码比这“快”,那么它可能做了一些不正确的事情,比如泄漏ResponsibilitysGood Response,但最后一条评论是有争议的:如果库希望尽可能“通用”,而不引起编译时间和模板的“可读性”成本,那么它应该有“指针和大小”参数(或等效的
array\u视图
抽象)而不是特定的容器(例如:
std::vector
),否则客户端将被迫提交使用或至少转换为特定类型,这是一个毫无意义的限制和/或运行时成本。@KABoissonneault是的,但这可以通过不使用
double**
double*
size\u t
来完成。