问题描述
在此代码中,在for循环中创建了指针数组newData
,然后将其推入向量testData
中。指针存储在向量std::vector<testData*>
中。
我的担心是,我需要确保在向量保持对指针的引用的同时,指针所引用的对象仍然有效。通过在for循环中调用行newData = new unsigned char[frameSize];
会丢失此引用吗?
我主要是想避免使用push_back
复制对象。
如何创建unsigned char*
个随机字符的数组(在这里我只使用'a'
),然后将这些数组推到向量上?
int numFrames = 25;
int frameSize = 100;
std::vector<unsigned char*> testData;
unsigned char *newData;
for (int i = 0; i < numFrames; i++) {
newData = new unsigned char[frameSize];
for (int j = 0; j < frameSize; j++) {
newData[j] = 'a'; // fill the frame with random data,'a' here
}
testData.push_back(newData);
newData = 0; // ??
memset(&newData,frameSize); // ??
}
std::cout << " testData " << testData.size() << "\n";
解决方法
我是否通过在for循环中调用行
newData = new unsigned char[frameSize];
来丢失此引用?
否,如果操作正确,那将是完全可行的。
尽管您的代码中存在一些问题,但在memset(&newData,frameSize); // ??
行中,您设置了指针占用的内存,该内存通常不超过8个字节(取决于体系结构),大小为100字节,这将导致未定义的行为。您可能想要:
memset(&newData,sizeof newData); // ??
但是这不能满足您的需要,使指针无效会使您失去对数据的访问权,而您又不想这样做,并且每次迭代都将相同的指针推向向量时,您将结束用填充有指向相同数据的相同指针的向量填充。
在for
循环中移动其声明将解决此问题。您不需要复制任何数据,而是在每次新迭代时将指向新内存位置的新指针推入向量中。
如何创建
unsigned char*
个随机字符的数组(在这里我只使用'a'
),然后将这些数组推入向量?
您的代码应如下所示:
#include <iostream>
#include <vector>
#include <ctime>
int main()
{
srand(time(0)); //seed,not the best randomizer but does the job here
const size_t numFrames = 25; //sizes can/should be constant and unsigned
const size_t frameSize = 100;
std::vector<unsigned char *> testData;
for (size_t i = 0; i < numFrames; i++)
{
//in each iteration a new pointer
unsigned char *newData = new unsigned char[frameSize];
for (size_t j = 0; j < frameSize; j++)
{
newData[j] = 'a' + rand() % 26; //random alphabetic char
}
testData.push_back(newData);
}
std::cout << "testData " << testData.size() << "\n";
for (size_t i = 0; i < numFrames; i++) //test print
{
for (size_t j = 0; j < frameSize; j++)
{
std::cout << testData[i][j];
}
std::cout << "\n";
}
}
不用说您应该delete
在您不再需要的时候分配先前分配的内存。
如果您想要更好的随机引擎,可以查看此帖子Generate random numbers using C++11 random library。
一些注意事项:
您可能已经知道newData
指针所指向的数据不能被视为字符串,也就是以null结尾的char数组,因为它们当然不是以null结尾的。
您需要手动管理分配的内存,也就是说,当您手动完成分配的内存后,还必须手动删除它。
代码更正适用于您的代码,但是对于WhozCraig correctly points out来说,最好使用STL容器而不是指针。