Я не думаю, что есть какой-то способ заставить компилятор принудительно применить его, но вы можете обнаружить некоторые экземпляры раньше, используя malloc_size.
void someFunc(int * mustBeHeap) {
assert(0!=malloc_size(mustBeHeap));
//do stuff
}
К сожалению, вы получите ложные срабатывания из кода, подобного этому:
void someOtherFunc() {
int * myInts=(int *)malloc(sizeof(int)*20);
someFunc(&(myInts[3]));
}
Это не будет работать слишком хорошо с чем-либо, выделенным с помощью new, boost :: pool и т. Д. Фактически, вы получите ложные срабатывания практически от всего.
Такжеmalloc_size не является стандартным.
Редактировать:
После просмотра одного из ваших комментариев о владении, похоже, некоторые из вещей, которые я описал как ложныеположительные значения в действительности являются ситуациями, которые вы также хотите обнаружить, поскольку вы намеревались освободить память от указателя.