Предупреждение 6011 в C ++ - PullRequest
       34

Предупреждение 6011 в C ++

1 голос
/ 15 апреля 2019

Я не понимаю смысла, если это предупреждение я получу. Мой код компилируется, но не может прочитать inputs половину времени.

typedef struct a
{
    double* inputs;
} A;

Я создаю новую структуру A:

A* createA(double* inputs) 
{
    A* a = (A*)malloc(sizeof(A));
    a->inputs = inputs;
}

Почему я получаю предупреждение 6011 на a->inputs = inputs;?

В документации Microsoft говорится, что для проверки, является ли данный аргумент NULL перед подачей a->inputs, ведь действительно хорошая практика для отслеживания ошибок.

Но даже добавляя:

A* createA(double* inputs) 
{
    A* a = (A*)malloc(sizeof(A));
    if (inputs != NULL)
        a->inputs = inputs;
    else /* error */
}

Я все еще получаю предупреждение, но в операторе if.

Ответы [ 3 ]

1 голос
/ 15 апреля 2019

Как объяснил @clcto, причина в том, что вы не проверяете ошибки.

Если вам не важна OOM, и вы можете использовать исключения, просто выполните:

struct A
{
    double* inputs;
};

A* createA(double* inputs) 
{
    A* a = new A;
    a->inputs = inputs;
    return a;
}

Потому что new скинет на ООМ.Если вы не можете использовать исключения и / или хотите вместо этого проверить возвращаемое значение, обратите внимание на использование new(std::nothrow).

. Также обратите внимание на обозначение struct A вместо typedef (не требуется в C ++).Кроме того, вы, вероятно, также должны использовать std::unique_ptr<A>.

1 голос
/ 15 апреля 2019

Проблема в том, что malloc может вернуть NULL, если произойдет сбой.В этом случае запись в a->inputs в следующей строке будет разыменовывать указатель NULL, который является неопределенным поведением, и его следует избегать.По общему признанию маловероятно, что malloc потерпит неудачу, но, поскольку вы хотите писать безопасный код, вам следует проверить возвращаемое значение malloc:

A* a = (A*)malloc(sizeof(A));
if (a != NULL){
    a->inputs = inputs;
} else {
    /* Handle error */
}

Поскольку вы пишете C ++, исходя из фона C, вы должны знать, что код, который вы пишете, по сути, все еще C и сильно отличается от современного C ++, в котором мы делаем много вещей совсем по-другому.В C ++ есть много очень полезных инструментов и идиом, которые мы хотели бы использовать.

Я предполагаю, что inputs - это список чисел.В C ++ я бы переписал ваш код следующим образом:

// no typedef
struct A {
    vector<double> inputs;
};

// no createA

// Example usage:
int main(){
    A a;

    // no manual memory management!!!

    // no pointers!

    // how many inputs?
    cout << "There are " << a.inputs.size() << " inputs\n";

    // add two inputs
    a.inputs.push_back(3.83);
    a.inputs.push_back(1.01);

    // print everything
    for (const auto& input : a.inputs){
        cout << input << " ";
    }

    return 0;
}

Так мы обычно делаем в C ++ в настоящее время.Под капотом происходит много всего, но общий опыт становится очень безопасным и дружелюбным, когда вы знаете, что делаете.Если вам интересно, я бы посоветовал вам выбрать из этот список хороших книг по С ++ и внимательно прочитать.В противном случае, возможно, проще всего придерживаться C, если вам это удобно.

0 голосов
/ 15 апреля 2019

В вашем случае проблема с памятью, потому что в структуре a есть указатели на входы.

входы не назначены. Вы должны выделить некоторую память, на которую указывают входные данные make, ИЛИ вы должны присвоить ей NULL, например, в конструкторе (да, вы можете добавить конструктор в структуру на C ++.)

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