C++: Как возможно, что чтение данных может влиять на память?

Вы можете использовать sscanf для этой цели. Ниже приведена быстрая реализация сценария на языке C.

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

int main(void) {
    unsigned long a;
    char array[10];
    char string[] = "\r\n9876543212345\r\n\r\nOK\r\n";
    sscanf(string , "\r\n%ld\r\n\r\n%s\r\n", &a, array);
    printf("%ld %s\n", a, array);
    return 0;
}
5
задан zenna 27 April 2009 в 22:26
поделиться

3 ответа

Это не конструктор массива:

float * flatFitness;
flatFitness = new float(popSize);

Здесь вы создаете один float в куче, инициализированный значением popSize . Если вам нужен массив с плавающей точкой, вам нужно использовать скобки вместо скобок:

float *flatFitness = new float[popSize];

Это может легко вызвать проблемы, которые вы описываете. Кроме того, помните, что при создании массивов вам необходимо удалить, используя delete [] (в конце концов):

delete [] flatFitness;

Если вы просто используете delete , это может сработать, но поведение не определено .

Если вы хотите вообще не использовать синтаксис массива, почему бы не использовать std :: vector ? Вы можете создать вектор элементов popSize следующим образом:

#include <vector>

std::vector<float> flatFitness(popSize);

Он будет автоматически освобожден, когда выйдет из области видимости, поэтому вам не нужно беспокоиться о new или delete .

Обновление (re: comment): Если вы уже используете std :: vectors в другом месте своего кода, взгляните на std :: vector :: swap () . Вы можете вообще избежать копирования и просто поменять пару векторов назад и вперед между буферизацией для CUDA и обработкой, которую вы здесь выполняете.

14
ответ дан 18 December 2019 в 14:51
поделиться

Я подозреваю, что у вас есть проблемы с многопоточностью или повреждением памяти, о которых вы не знаете. Поведение, которое вы описываете, не является каким-то стандартным, заведомо желательным поведением.

0
ответ дан 18 December 2019 в 14:51
поделиться

jeffamaphone может быть прав, что это проблема с многопоточностью. Другая возможность состоит в том, что объекты, которые вы читаете, уже были удалены. Вы бы тогда читали с неверного адреса. Также возможно, что структуры данных, в которые вы пишете в это время, хранятся в том же месте, где ранее находились векторы. Это может привести к описанному вами поведению.

РЕДАКТИРОВАТЬ (на основе вашего обновления):

Это может быть неисправно: stringLength инициализируется вне внешнего цикла, но это похоже, что его нужно обновить во время этого внешнего цикла:

int stringLength = pop->GetGenome(0).GetLength();
for (int i=0;i<pop->GetPopSize();i++)
    for (int j=0;j<stringLength;j++)
        flatGenes[(i*stringLength)+j]<< pop->GetGenome(i).GetFloatGene(j);

Предлагаемое исправление:

for (int i=0;i<pop->GetPopSize();i++) {
    int stringLength = pop->GetGenome(i).GetLength();
    for (int j=0;j<stringLength;j++) {
        flatGenes[(i*stringLength)+j]<< pop->GetGenome(i).GetFloatGene(j);
    }
}
-1
ответ дан 18 December 2019 в 14:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: