2015-09-21 1 views
0

Je suis tout à fait nouveau dans le monde des pointeurs en C/C++ donc cela peut être tout à fait une question facile pour vous:en utilisant le pointeur int dans plusieurs Couts

Le C suivant ++ - code fonctionne normalement

#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; 
} 

mais cesse de fonctionner lors du changement

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

à

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

. Par "arrête de travailler" je veux dire: "est bloqué par ma sécurité norton comme une menace potentielle" (résultant en un code de retour de "0x76F531AF" si cela aide). Comme norton n'interfère normalement pas avec ma programmation, je suppose que la double utilisation du pointeur int dans cout se traduit d'une manière ou d'une autre par une erreur de segmentation ...

Merci pour votre aide!

PS:

J'utilise Code :: Blocks sous Windows 8.1 avec le compilateur GCC et GDB débogueur de TDM-GCC (version 4.7.1, 32 bits).

EDIT: suppression de la suppression du pointeur -> le problème persiste.

+1

'delete thePointer' n'est nécessaire que lorsque vous avez fait' int * thePointer = new int' alors veuillez l'enlever – nodakai

+0

J'ai supprimé la ligne, le problème persiste. – MtDoom

+1

Vous exécutez peut-être une ancienne version de votre binaire de sortie par hasard? Avez-vous vérifié Release/Debug config etc? Votre IDE a-t-il une commande "propre"? Je demande ceci parce qu'il n'y a rien de mal avec votre code après que vous ayez enlevé 'delete thePointer'. – nodakai

Répondre

0

Vous pouvez seulement delete objets créés sur le tas (en utilisant new ou C-style malloc et autres).

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

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

// deallocate 
delete intOnTheHeap; 

Si vous utilisez un pointeur vers une variable locale, il pointe vers une entrée de la pile. Vous n'avez pas besoin de libérer cette mémoire vous-même. La mémoire est "libérée" en changeant automatiquement le stackpointer lorsque votre variable est hors de portée (à la fin de la fonction).

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 
} 
+0

Thx! J'ai changé cette partie, mais le problème demeure. – MtDoom

+0

@MtDoom Je ne sais pas à propos de Norton, mais en dehors de la 'delete' votre code est parfaitement bien. Il n'y a certainement pas de faute de segmentation. – mastov

+0

ressemble à norton est le seul vrai problème ici. Devrais-je changer les drapeaux et le titre de la question ou est-ce que je ne fais que marquer ma propre réponse («C'est la faute de Norton») comme une solution et ne rien faire de plus? – MtDoom

0

Depuis que je suis la même erreur après Norton-interception dans des contextes totalement différents, cela semble être un cas de Code :: Blocks incompatibilité Norton.