2013-10-10 26 views
1
int a; 
int *b; 
void test(int* target) 
{ 
    delete(target); 
} 
test(new int); // <-- It's ok, of course. 
test(&a); // <-- It raises assertion fail, of course, too. 

鉴于以上代码。我只知道target是一个指向整数的指针。我怎样才能说出参数指针的来源?如何判断指针参数的来源?

+0

你是什么意思的来源? – Annabelle

+1

你对分配的东西没有可视性。这取决于你跟踪。 – Joe

+3

你根本无法可靠地做到这一点。这就是为什么手动内存管理很复杂并且最好避免的原因,否则你可能会抛出if(safe_to_delete(ptr))delete ptr;并且很高兴。 – us2012

回答

3

无法可靠地判断指针是否指向内存的有效动态分配部分的开始位置。

这就是为什么手动内存管理首先是复杂的 - 对于您动态分配的所有内容,您需要正确定义由谁负责创建以及由谁负责删除。获得这个错误会导致未定义的行为,段错误和所有其他类型的难以追踪的错误。请记住,虽然C++为您提供了大量工具(RAII,智能指针等),除了少数几种情况外,这些工具可以使手动内存管理变得不必要。