LINUX.ORG.RU

ссылки и приведение типов


0

1
$ cat test.c 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void my_free(void*& p)
{
    free(p);
    p = NULL;
}

int main()
{
    void *p1 = malloc(10);
    my_free(p1);
    char *p2 = (char*)malloc(10);
    my_free(p2);
    return 0;
}

На my_free(p2); g++ ругается invalid initialization of reference of type ‘void*&’ from expression of type ‘char*’ те приведения к void* для ссылок нету... это не победить?

★★★★

понятно что ожно пердавать указатель на указатель, но сами вызовы не хотелось бы трогать

quest ★★★★
() автор топика
Ответ на: комментарий от quest
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void my_free(void ** p)
{
    free(*p);
    *p = NULL;
}

int main()
{
    void * p1 = malloc(10);
    my_free(&p1);
    char * p2 = (char*)malloc(10);
    my_free((void**)&p2);
    return 0;
}

только не используй это в своих программах...

ei-grad ★★★★★
()

Если очень хочется, то можно так:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

template <typename T>
void my_free(T *& p)
{
    free(p);
    p = NULL;
}

int main()
{
    void *p1 = malloc(10);
    my_free(p1);
    char *p2 = (char*)malloc(10);
    my_free(p2);
    return 0;
}

Но по хорошему - не стоит исползовать malloc/free, и void* в C++

hydraulicbrakefluid
()
Ответ на: комментарий от hydraulicbrakefluid

Да уж, malloc и free с использованием шаблонов - это для истинных ценителей. malloc не нужен, это точно.

anonymous
()
Ответ на: комментарий от hydraulicbrakefluid

точно! думал про темплейты но отбросил как-то!

quest ★★★★
() автор топика
Ответ на: комментарий от anonymous

malloc и free это не самое плохое что есть, мне сейчас такой код поддерживать дали что туши свет

quest ★★★★
() автор топика
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void my_free(void *p)
{
        void **tmp = p;
        free(*tmp);
        *tmp = NULL;
}

int main()
{
        void *p1 = malloc(10);
        char *p2 = (char*)malloc(10);
        my_free(&p1);
        my_free(&p2);
        return 0;
}

Так ругаться не будет. Но лучше так не писать

ttnl ★★★★★
()

А что же про шаблоны помним, а про макросы забыли. А это же прекрасное дополнение к сишным malloc и free.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void my_free(void*& p)
{
        free(p);
        p = NULL;
}

#define MY_FREE(p) my_free(reinterpret_cast<void*&>(p))

int main()
{
        void *p1 = malloc(10);
        char *p2 = (char*)malloc(10);		
        MY_FREE(p1);
        MY_FREE(p2);
        return 0;
}
anonymous
()
Ответ на: комментарий от ttnl

>Так ругаться не будет. Но лучше так не писать
Так видимо только при -O0 будет работать да и то не факт, глюкалово конкретное

quest ★★★★
() автор топика
Ответ на: комментарий от anonymous

С reinterpret_cast то-же круто, но template тут вообще прекрасно выглядит

quest ★★★★
() автор топика
Ответ на: комментарий от legolegs

>wtf?
я ж изначально про ссылки написал, а расширение... это вычурный пример набросанный за полминуты, тем более что я про g++ писал

quest ★★★★
() автор топика
Ответ на: комментарий от quest

Если вы настаиваете что это С++, то у вас в каждой строчке (за исключением, может, одной) ошибка.

quasimoto ★★★★
()

возможно, нужно писать на с?

najar
()
Ответ на: комментарий от quest

>Так видимо только при -O0 будет работать да и то не факт, глюкалово конкретное

Будет работать всегда и не будет глючить. Просто это плохой стиль. Лучшее решение - через define.

ttnl ★★★★★
()
Ответ на: комментарий от hydraulicbrakefluid

Но по хорошему - не стоит исползовать malloc/free [..] в C++

да можно, можно их использовать, только не надо мешать malloc/free с new/delete

shty ★★★★★
()
Ответ на: комментарий от shty

Я этот риск и имел в виду, но в большом проекте порой бывает очень сложно отследить, кто как был выделен, особенно если какой-то указатель гуляет по системе от одного обьекта к другому, итп. Лучше уж все через одно место (new/delete) сразу делать и не переживать

hydraulicbrakefluid
()
Ответ на: комментарий от Booster

> Потому-что так сказал дядя Вася?

Потому что иногда это reintrept, а иногда static. А что где - хер разберешь

namezys ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.