Я довольно новичок в мире указателей на 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-разрядная версия).
РЕДАКТИРОВАТЬ: удалено удаление указателя -> проблема остается.
Ты можешь только 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
}
Так как я получил ту же ошибку после Norton-Interception в совершенно разных контекстах, похоже, это случай несовместимости Code :: Blocks Norton.