Хотя я почти уверен, что другие ответы верны, когда они говорят, что вам не следует связываться с попыткой определить, находится ли объект в куче или стеке, я должен не согласиться, что это «невозможно» определить.
В следующем примере используются окна (и процедура будет отличаться для каждой ОС!):
#include <Windows.h>
bool isAddressOnHeap(void* address) {
bool returnval = 0;
PROCESS_HEAP_ENTRY entry;
HANDLE procHeap = GetProcessHeap();
if (procHeap == NULL) {
std::cerr << "Failed to retrieve Heap.\n";
return -1;
}
if (HeapLock(procHeap) == FALSE) {
std::cerr << "Failed to lock heap.\n";
return -1;
}
entry.lpData = NULL;
if (HeapWalk(procHeap, &entry) != 0) {
if (entry.wFlags & PROCESS_HEAP_REGION) {
std::cout << "Function succeeded. The heap begins at " << (void*)entry.Region.lpFirstBlock << " and ends at " << (void*)entry.Region.lpLastBlock << "\n";
if (address >= (void*)entry.Region.lpFirstBlock && address <= (void*)entry.Region.lpLastBlock)
returnval = 1;
}
}
if (HeapUnlock(procHeap) == FALSE) {
std::cerr << "Failed to unlock heap.\n";
return -1;
}
return returnval;
}
Эта функция определит, находится ли данный адрес в куче или нет.Вот тестовая программа:
int main()
{
int i = 1;
std::cout << "Address of i on Stack: " << (void*)&i << "\n";
int* j = new int;
*j = 1;
std::cout << "Address of j on Heap: " << (void*)j << "\n";
int* k = (int*)malloc(sizeof(int));
*k = 1;
std::cout << "Address of k on Heap: " << (void*)k << "\n";
std::cout << "is i on Heap?: " << isAddressOnHeap(&i) << "\n";
std::cout << "is j on Heap?: " << isAddressOnHeap(j) << "\n";
std::cout << "is k on Heap?: " << isAddressOnHeap(k) << "\n";
delete j;
free(k);
return 0;
}
Программа возвращает на моем компьютере следующее:
Address of i on Stack: 0000001062AFFE80
Address of j on Heap: 0000018B11C530B0
Address of k on Heap: 0000018B11C53070
Function succeeded. The heap begins at 0000018B11C40740 and ends at 0000018B11D3F000
is i on Heap?: 0
Function succeeded. The heap begins at 0000018B11C40740 and ends at 0000018B11D3F000
is j on Heap?: 1
Function succeeded. The heap begins at 0000018B11C40740 and ends at 0000018B11D3F000
is k on Heap?: 1
Подробнее о том, как работает этот код, можно узнать на сайте Microsoft .
На компьютерах с Linux, похоже, аналогичные способы сделать это делают.
Но в качестве последнего слова предупреждения: этот ответ является лишь подтверждением концепции!