2013-09-19 4 views
2

У меня есть необычное требование, чтобы переменная всегда была в куче, а не в стеке. Теперь я попытался сделать это с помощью частного деструктора и статического метода класса, который просто возьмет указатель и вызовет delete на нем.Как разместить переменную в стеке или на куче

Class A 
{ 
public : 
static void method(const A* ptr) 
{ 
delete ptr; 
} 
private : 
~A(); 
}; 

Но теперь я просто любопытно, чтобы лучше видеть altrnative и одна вещь пришла мне в голову, если я могу добавить некоторые предварительно проверить каждый метод, чтобы увидеть погоду переменная на стеке или куче, то я не должны объявить статический метод. Может ли кто-нибудь сказать мне, как это сделать? У меня только одно решение - использовать sbrk (0) или pthread API для получения границы текущего стека, а затем сравнить его с адресом переменной класса, но не переносимым.

Благодаря Niraj Rathi

+0

Удалённый тег 'c'. –

+0

Тестовая программа, которую я написал, находится на C++, но это применимо к C, а также где у одного нет возможности определять местоположение указателя на стеке или на куче? – anonymous

+1

См. [Этот вопрос] (http://stackoverflow.com/questions/16360620/find-out-whether-a-pointer-is-pointing-at-the-stack-heap-or-program-text). Это невозможно сделать портативным способом. Для многих систем ваше текущее решение будет делать то, что вы хотите, хотя технически это означает только то, что вы не можете иметь объект 'A' с * автоматическим временем хранения *. – us2012

ответ

2

На самом деле, ваше решение не работает.

using Buffer = std::aligned_storage<sizeof(A), alignof(A)>::type; 

int main() { 
    // Allocate scratch area to build a 'A' 
    Buffer buffer; 

    // Build a 'A' using placement new 
    new (&buffer) A(); 

    // Ensure proper deletion at end of scope using `unique_ptr` 
    // and a custom deleter (and cast to `A*` as we go). 
    std::unique_ptr<A, A::method> a(reinterpret_cast<A*>(&buffer)); 

    a->method(0); 
    // ... 
} 

Так, на вершине предотвращения произвольного разрушения, необходимо также, чтобы предотвратить произвольные строительства (который включает в себя от копирования строительства и въезд строительства). Вы можете оставить назначение общедоступным, потому что оно назначает существующий объект, и, контролируя строительство, вы обеспечивали размещение всех существующих объектов там, где вы хотите.

+0

Спасибо, но я использую Sun Studio, который не совместим с C++ 11, и я не думаю, что он будет рядом или далеко. – anonymous

+0

@NIRAJRATHI - разработчики Oracle Solaris Studio заявили, что поддержка C++ 11 находится в стадии разработки: https://forums.oracle.com/message/9954921 и бета-документы для следующих частей версии версии поддерживаются: http: // docs.oracle.com/cd/E37069_01/html/E37071/gncix.html#scrolltoc – alanc

Смежные вопросы