Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将指针数组推入std::vector,避免使用push_back复制对象_C++_Pointers_Random_Stdvector - Fatal编程技术网

C++ 将指针数组推入std::vector,避免使用push_back复制对象

C++ 将指针数组推入std::vector,避免使用push_back复制对象,c++,pointers,random,stdvector,C++,Pointers,Random,Stdvector,在这段代码中,在for循环中创建一个指针数组newData,然后将其推入向量testData。指针存储在向量std::vector中 我关心的是,我需要确保指针引用的对象在向量持有对它们的引用时保持有效。调用行newData=newunsignedchar[frameSize]是否会丢失此引用在for循环中 我主要希望避免使用向后推复制对象 如何创建随机字符的无符号字符*数组(这里我只使用'a'),然后将这些数组推送到向量 int numFrames = 25; int frameSize =

在这段代码中,在for循环中创建一个指针数组
newData
,然后将其推入向量
testData
。指针存储在向量
std::vector

我关心的是,我需要确保指针引用的对象在向量持有对它们的引用时保持有效。调用行
newData=newunsignedchar[frameSize]是否会丢失此引用在for循环中

我主要希望避免使用
向后推
复制对象

如何创建随机字符的
无符号字符*
数组(这里我只使用
'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, 0, frameSize); // ??
}

std::cout << " testData " << testData.size() << "\n";
int numFrames=25;
int frameSize=100;
向量测试数据;
无符号字符*新数据;
对于(int i=0;inewData=newunsignedchar[frameSize]是否会丢失此引用在for循环中

不,如果做得正确,这是完全可行的

但是,代码中有一些问题,在
memset(&newData,0,frameSize);/设置指针占用的内存,通常不超过8字节(取决于架构),大小为100字节,这会调用未定义的行为。您可能想要:

memset(&newData, 0, sizeof newData); // ??
但这并不能满足您的需要,取消指针将使您失去对数据的访问,您不希望这样,并且在每次迭代中将同一指针推送到向量,您将得到一个向量,其中填充了指向同一数据的同一指针

将其声明移动到
for
循环中可以解决这个问题。您没有复制任何数据,而是在每次新的迭代中将指向新内存位置的新指针推送到向量中

如何创建随机字符的
无符号字符*
数组(这里我只使用
'a'
),然后将这些数组推送到向量`

您的代码应该如下所示:

#包括
#包括
#包括
intmain()
{   
srand(time(0));//seed,不是最好的随机化器,但在这里完成了工作
const size\u t numFrames=25;//大小可以/应该是常量且无符号
常量大小\u t frameSize=100;
向量测试数据;
对于(大小i=0;i这段代码看起来好吗?这完全取决于它应该做什么。我会说不,因为我认为没有必要使用原始指针
memset(&newData,0,frameSize)“<代码> >不正确。请不要使用垃圾邮件标签。<代码> C++ 11 和 C++ 14 标签是针对C++标准的问题。如果您用当前的标准标记“代码> C++ +代码> >编译,就足够了,如果您依赖旧的,只标记不,这看起来不太好。非常好,一定会崩溃。为什么不使用(a)
std::vector
,或者(b)
std::vector
,或者,如果
frameSize
是编译时已知的常量,(c)
std::vector
?简而言之,你为什么认为你需要向量中的原始指针?除非你能找到一个令人信服的理由,否则很有可能你不需要这样做,而我提到的其中一个选项对于你所需的工作流来说是可行的,甚至是最优的。而且你似乎觉得指针是天生的引用对象在C++中,它们不是。谢谢你的评论!只是添加了我使用向量<代码>测试数据> /Case>,所以我的担心是我可以在循环中调用<代码>无符号char *NeDATA=No..…/Cuth>?我推到的向量会受到这个调用的影响吗?@ MaMaMeZad,你的问题的答案,是的,你可以,<代码> NeDATAs将被视为不同的指针,在每次新迭代时指向不同的内存位置。每个向量元素将有不同的指针指向不同的数据,没有副本。检查我的答案,它应该可以解决您的问题
#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";
    }
}