2010-12-15 41 views
2

S'il vous plaît laissez-moi savoir si je peux le faire ou non?numéro de ligne Gettin de la fonction appelée

J'écris une bibliothèque qui pourrait fonctionner pour suivre l'allocation de mémoire et la désaffectation en C++. En bref, j'essaie de voir si mon application n'a pas de fuites de mémoire. C'est ce que j'ai fait jusqu'ici.

Overrode le nouveau et l'opérateur de suppression et maintenant. Chaque fois que l'application utilise de nouvelles, je prévois de stocker l'adresse et le nombre d'octets qui sont alloués dans cet appel. De même, lorsque la suppression est appelée sur cette adresse, je vais l'enlever de la liste stockée. Jusqu'à maintenant son amende. Mais je veux stocker le nom de fichier et le numéro de ligne d'où le "nouveau" est appelé. Je ne peux le faire que dans le nouveau remplacé. Y a-t-il un moyen d'obtenir le numéro de ligne dans la fonction surchargée?


1 int main() 
2 { 
3  // Say, A is a structure 
4  A *a = new A(); 
5  return 0; 
6  } 
7 void* operator new(size) 
8 { 
9  // 
10  // store the line number and file name on line 4 ??? Can I do it? 
11  return (malloc(size)); 
12 } 
------------------------ 
+3

Pourquoi ne pas utiliser Valgrind? Et ne pas ré-implémenter la roue? Bien sûr, vous voulez vraiment faire cela, bien sûr – YuppieNetworking

+0

@Yuppie Valgrind n'est pas sur Solaris. – chrisaycock

+2

Pour les tests de niveau production sur Solaris, utilisez DTrace plutôt que d'écrire votre propre profileur. – chrisaycock

Répondre

3

les macros __LINE__ donne le numéro de ligne mais aussi __FUNCTION__ et __FILE__ sont vraiment utiles, donnant la const char * de la fonction englobante et le nom du fichier. edit: (__FUNCTION__ n'est pas standard mais supporté par plusieurs compilateurs) Mais malheureusement ces prennent seulement leur valeur en place. Il n'est donc pas possible de demander l'appelant. Vous devez écrire les macros __LINE__ et __FILE__ partout où vous utilisez new. :(

Ou ... vous pouvez avoir accès à la pile d'appelants, mais je ne connais pas de façon commune de le faire ... et j'avais déjà cherché longtemps afin de penser qu'il est pas possible sinon en mode débogage.

+0

'__LINE__' et' __FILE__' sont des macros C standard et ne sont pas spécifiques à Visual Studio. '__FUNCTION__' n'est pas standard, mais beaucoup de compilateurs ont des alternatives équivalentes. –

+0

thx, je vais modifier pour corriger cela. –

+0

oui ... __LINE__ et __FILE__ sont utiles mais comme vous l'avez dit, ils ne peuvent être utiles que lorsque nous les utilisons dans une macro. J'ai beaucoup de nouvelles et dels dans mes nombreux processus dans l'application. Donc, c'est un gros mal de tête ... ressemble au dernier recours, dTrace. – user543630

1

Enfin, je suis une réponse par l'un des sujets similaires dans ce forum ... Le code suivant a travaillé ... Disons que,

class A 
{ 
    public: 
    char str[1000]; 
    A() 
    { 
     strcpy(str,"Default string"); 
    } 
    A(const char* s) 
    { 
     strcpy(str,s); 
    } 
}; 

void * operator new (unsigned size, char const * file, int line) 
{ 
    cout << "File = " << file << endl; 
    cout << "Line = " << line << endl; 
    return(malloc(size)); 
} 
#define new new(__FILE__, __LINE__) 
int main() 
{ 
    A *a = new A("Leak"); 
    printf("%s",a->str); 
    delete a; 
    return 0; 
} 

poste connexes où j'ai trouvé la réponse ... overloading new and delete in c++

+0

Veuillez prendre en compte la suppression de l'opérateur de surcharge et l'opérateur new [], opérateur delete [], comme indiqué sur http://www.gotw.ca/gotw/010.htm. –

+0

Quel complément utilisiez-vous? Cela ne fonctionne pas dans g ++ version 4.8.1 –

+0

Je ne suis pas sûr, si un tel '# define' est conforme aux normes. Par exemple, redéfinir 'return' est un comportement indéfini. – sukhmel