Используя указатель int в нескольких кутах

Я довольно новичок в мире указателей на C/C++, так что это может быть довольно простой вопрос для вас:

Следующий C++- код работает нормально

#include <iostream>

int main()
{
    int theInt = 1337;
    int & theReference = theInt;
    int * thePointer = &theInt;

    std::cout << "int: " << theInt << "\n";
    std::cout << "referenz: " << theReference << "\n";
    std::cout << "pointer: " << *thePointer << "\n";
    std::cout << "pointer: " << *thePointer << "\n";

    //std::cout << "foo" << "\n";

    return 0;
}

но перестает работать при смене

//std::cout << "foo" << "\n";

в

std::cout << "foo" << "\n";

,

Под "прекращением работы" я подразумеваю: "заблокирован моей системой безопасности norton как потенциальная угроза" (в результате получится код возврата "0x76F531AF", если это поможет). Поскольку norton обычно не мешает моему программированию, я предполагаю, что двойное использование указателя int в cout каким-то образом приводит к segfault...

Спасибо за вашу помощь!

PS:

Я использую Code::Blocks в Windows 8.1 с компилятором GCC и отладчиком GDB из TDM-GCC (версия 4.7.1, 32-разрядная версия).

РЕДАКТИРОВАТЬ: удалено удаление указателя -> проблема остается.

2 ответа

Так как я получил ту же ошибку после Norton-Interception в совершенно разных контекстах, похоже, это случай несовместимости Code::Blocks Norton.

Ты можешь только delete объекты, созданные в куче (используя new или C-стиль malloc и тому подобное).

// allocate on the heap
int *intOnTheHeap = new int;

// do some stuff with it
*intOnTheHeap = 0;
(*intOnTheHeap)++;
std::cout << *intOnTheHeap << std::endl;

// deallocate
delete intOnTheHeap;

Если вы возьмете указатель на локальную переменную, он будет указывать на запись в стеке. Вам не нужно и не следует освобождать эту память самостоятельно. Память "освобождается" путем автоматического изменения указателя стека, когда ваша переменная выходит из области видимости (в конце функции).

void myFunction() {
    int localVariable;
    int *pointerToLocalVariable = &localVariable;

    // forbidden and unnecessary:
    //delete pointerToLocalVariable;

    // here (end of the block) the memory on the stack
    // will be freed automatically
}
Другие вопросы по тегам