markparticle / WebServer

C++ Linux WebServer服务器
Apache License 2.0
3.49k stars 730 forks source link

httprequest.cpp代码有问题 #96

Closed InitialZJ closed 4 months ago

InitialZJ commented 9 months ago

httprequest.cpp 中第233行 SqlConnPool::Instance()->FreeConn(sql); 这句话是多余的,因为在 SqlConnRAII 析构的时候,析构函数里面会调用 connpool_->FreeConn(sql_); 。如果不删去这句话,会导致数据库连接池数量增加,这句话应该删去。

Nana5aki commented 6 months ago

UserVerify函数内SqlConnRAII(&sql, SqlConnPool::Instance());这段代码也声明了一个临时对象后马上被析构,内部的sql连接已经free,而外部的sql还指向原链接,这个是不是也有点问题?

InitialZJ commented 6 months ago

UserVerify函数内SqlConnRAII(&sql, SqlConnPool::Instance());这段代码也声明了一个临时对象后马上被析构,内部的sql连接已经free,而外部的sql还指向原链接,这个是不是也有点问题?

这里只有到花括号结束才会析构,也就是生命周期是整个函数。

Nana5aki commented 6 months ago

UserVerify函数内SqlConnRAII(&sql, SqlConnPool::Instance());这段代码也声明了一个临时对象后马上被析构,内部的sql连接已经free,而外部的sql还指向原链接,这个是不是也有点问题?

这里只有到花括号结束才会析构,也就是生命周期是整个函数。

懂了,感谢 😇

swwang817 commented 5 months ago

UserVerify函数内SqlConnRAII(&sql, SqlConnPool::Instance());这段代码也声明了一个临时对象后马上被析构,内部的sql连接已经free,而外部的sql还指向原链接,这个是不是也有点问题?

这里只有到花括号结束才会析构,也就是生命周期是整个函数。

匿名实例应该是这句代码结束就会析构吧

InitialZJ commented 5 months ago

UserVerify函数内SqlConnRAII(&sql, SqlConnPool::Instance());这段代码也声明了一个临时对象后马上被析构,内部的sql连接已经free,而外部的sql还指向原链接,这个是不是也有点问题?

这里只有到花括号结束才会析构,也就是生命周期是整个函数。

匿名实例应该是这句代码结束就会析构吧

你是对的,我搞错了,那这里还是有点问题。

Nana5aki commented 5 months ago

UserVerify函数内SqlConnRAII(&sql, SqlConnPool::Instance());这段代码也声明了一个临时对象后马上被析构,内部的sql连接已经free,而外部的sql还指向原链接,这个是不是也有点问题?

这里只有到花括号结束才会析构,也就是生命周期是整个函数。

匿名实例应该是这句代码结束就会析构吧

是的,可能是因为数据库连接池初始化有10个连接,然后这个用户验证耗时又少,所以程序运行没有问题,我将连接池改成只有一个连接,多开几个网页同时登陆,也能够正常运行😰

InitialZJ commented 5 months ago

UserVerify函数内SqlConnRAII(&sql, SqlConnPool::Instance());这段代码也声明了一个临时对象后马上被析构,内部的sql连接已经free,而外部的sql还指向原链接,这个是不是也有点问题?

这里只有到花括号结束才会析构,也就是生命周期是整个函数。

匿名实例应该是这句代码结束就会析构吧

是的,可能是因为数据库连接池初始化有10个连接,然后这个用户验证耗时又少,所以程序运行没有问题,我将连接池改成只有一个连接,多开几个网页同时登陆,也能够正常运行😰

原来如此

1900100209 commented 4 months ago

UserVerify函数内SqlConnRAII(&sql, SqlConnPool::Instance());这段代码也声明了一个临时对象后马上被析构,内部的sql连接已经free,而外部的sql还指向原链接,这个是不是也有点问题?

这里只有到花括号结束才会析构,也就是生命周期是整个函数。

匿名实例应该是这句代码结束就会析构吧

是的,可能是因为数据库连接池初始化有10个连接,然后这个用户验证耗时又少,所以程序运行没有问题,我将连接池改成只有一个连接,多开几个网页同时登陆,也能够正常运行😰

原来如此

那正确逻辑应该是不要创建匿名对象,然后把SqlConnPool::Instance()->FreeConn(sql); 删去吧,这样逻辑应该就对了吧

wangerforcs commented 4 months ago

SqlConnRAII(&sql, SqlConnPool::Instance());改成创建具名对象SqlConnRAII raii(&sql, SqlConnPool::Instance());的形式,然后删去后面手动释放的SqlConnPool::Instance()->FreeConn(sql);