Динамический массив структуры со строковыми членами - PullRequest
0 голосов
/ 12 октября 2019

Я создал в своей программе динамический массив struct, члены которой также являются строками. У меня есть некоторые сомнения относительно безопасного поведения при манипулировании строками внутри динамически распределяемой структуры. Могу ли я обновлять или объединять строки, как это делают обычные строковые переменные? Должен ли я беспокоиться о границах выделенной памяти структуры?

Чтобы сделать это немного яснее, у меня есть что-то вроде следующего псевдокод :

Сначала у меня есть объявление структуры

struct myStruct
{
    ...
    int data1;
    int data2;
    std::string myString1;
    std::string myString2;
    ...
}

Затем структура выделяется

mystruct testStruct*;
testStruct = new mystruct [MAX_DEPTH];

Строки инициализируются

for(int i=0; i<MAX_DEPTH; i++)
{
    ...
    testStruct[i].myString1 = "";
    testStruct[i].myString2 = "";
    ...
}

Во время программных циклов строкизначения назначаются и обновляются

...
testStruct[N].myString1 = "Some text";
...
testStruct[N].myString1 += "Some other text";
...

Здесь я не уверен, что правильно обработал выделенную память.

Являются ли эти назначения правильными и безопасными даже внутри динамически распределенного массива структуры? ? Я рискую нарушить границу динамически выделенной памяти для переменной myStruct?

Спасибо

РЕДАКТИРОВАТЬ: я исправил [i] неправильно помещен в psuedocode.

Ответы [ 2 ]

0 голосов
/ 12 октября 2019
Строка класса

реализована следующим образом:

namespace std {
    template <typename charT,
              typename traits = char_traits<charT>,
              typename Allocator = allocator<charT>>
            class basic_string;

    typedef basic_string<char> string;
}

Третий аргумент - это модель памяти, используемая классом строки, который обрабатывает выделение и освобождение памяти.

0 голосов
/ 12 октября 2019

Для начала выражения внутри цикла неверны

for(int i=0; i<MAX_DEPTH; i++)
{
    ...
    testStruct.myString1[i] = "";
    testStruct.myString2[i] = "";
    ...
}

Вы имеете в виду

for(int i=0; i<MAX_DEPTH; i++)
{
    ...
    testStruct[i].myString1 = "";
    testStruct[i].myString2 = "";
    ...
}

Но в любом случае цикл является избыточным, поскольку объекты типа std :: stringбыли уже инициализированы по умолчанию при выделении памяти для массива структур.

Что касается этих операторов

testStruct.myString1[N] = "Some text";
...
testStruct.myString1[N] += "Some other text";

, то снова необходимо применить оператор индекса к указателю testStruct. Например,

testStruct[N].myString1 = "Some text";
...
testStruct[N].myString1 += "Some other text";

Я рискую нарушить границу динамически выделенной памяти для переменной myStruct?

Если вы будете использовать индекс, который больше илиравный MAX_DEPTH с указателем testStruct, тогда очевидно, что будет неопределенное поведение,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...