springxxc 发表于 2008-11-22 01:21

子程序调用时出现的一个非常奇怪的现象,谁能够解释呢

//子程序调用时出现的一个非常奇怪的现象,谁能够解释呢
//如下程序中主程序main(),访问了子程序GetPointCoord()已释放的变量,这显然是逻辑错误
//但若将错就错,出现一种无法解释的问题

#include "stdafx.h"
#include "stdio.h"
typedef float (*vec3f);
vec3f GetPointCoord()
{
float x={1,8,4};
vec3f point=&x;
//若有下面这两条语句,程序运行N多次,每次都能够输出正确结果;
//但若没有下面这两条语句,运行N多次,没有一次能够得到正确结果,
//不知道这是为什么,有人能够解释吗
float *y=new float;
delete[] y;
return point;//
}
int main(int argc, char* argv[])
{
vec3f a=GetPointCoord();
float* c=*a;
float c0=c;
float c1=c;
float c2=c;
printf("%f\n%f\n%f\n",c0,c1,c2);
return 0;
}

springxxc 发表于 2008-11-22 01:23

正确的程序可以如下

正确的程序可以如下:
// testReturn.cpp : Defines the entry point for the console application.
//子程序调用时出现的一个非常奇怪的现象,谁能够解释呢
//如下程序中主程序main(),访问了子程序GetPointCoord()已释放的变量,这显然是逻辑错误
//但若将错就错,出现一种无法解释的问题
#include "stdafx.h"
#include "stdio.h"
typedef float (*vec3f);
float x={1,8,4};
vec3f GetPointCoord()
{

vec3f point=&x;

float *y=new float;
delete[] y;
return point;//
}
int main(int argc, char* argv[])
{
vec3f a=GetPointCoord();
float* c=*a;
float c0=c;
float c1=c;
float c2=c;
printf("%f\n%f\n%f\n",c0,c1,c2);
return 0;
}

erdgzw 发表于 2008-11-28 11:39

1.第一个程序是正确的,去掉
float *y=new float;
delete[] y;
我试了一下,也是可以的。
在main函数中GetPointCoord将返回的point值赋给了自定义变量a,然后释放point所占的内存空间,并没有什么错误。

cooller 发表于 2009-1-2 01:11

建议不要重新定义float。这个是c++中的关键字之一。
float *y = new float;
此时为:
(*vec3f ) (*y) = new (*vec3f);
这样的定义不是自己给自己找麻烦么?
页: [1]
查看完整版本: 子程序调用时出现的一个非常奇怪的现象,谁能够解释呢