如何保留 **double 的数据?
How to keep data of a **double?
假设我有一个 class,它有一个指针成员的双指针:
public:
double **pSamples;
在成员 class 函数中,有时,我使用 RAII 惯用语填充此 "matrix":
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());
}
一切顺利!但是现在,如果稍后在另一个函数上我尝试 iterate/manage 这个指针的指针,我会遇到访问冲突。
我认为是因为当 LoadWave() 结束时 vector release/destroy 正确吗?
您将如何保留 data/matrix?这样我以后可以重新使用它吗?
您生成了一个悬挂指针,这当然会导致访问冲突。 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 数组自适应(不会 need/provide 和 double**
)实现起来相当简单。
根据您的评论,我怀疑您使用的框架不是 C++ 或编写得不好:好的 C++ 接口不会使用 double**
(甚至 double*
),不考虑效率。
假设我有一个 class,它有一个指针成员的双指针:
public:
double **pSamples;
在成员 class 函数中,有时,我使用 RAII 惯用语填充此 "matrix":
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());
}
一切顺利!但是现在,如果稍后在另一个函数上我尝试 iterate/manage 这个指针的指针,我会遇到访问冲突。
我认为是因为当 LoadWave() 结束时 vector release/destroy 正确吗?
您将如何保留 data/matrix?这样我以后可以重新使用它吗?
您生成了一个悬挂指针,这当然会导致访问冲突。 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 数组自适应(不会 need/provide 和 double**
)实现起来相当简单。
根据您的评论,我怀疑您使用的框架不是 C++ 或编写得不好:好的 C++ 接口不会使用 double**
(甚至 double*
),不考虑效率。