MySQL的创建以及注意事项

文章讨论了在C++中使用MySQL时,为何不建议在`main`函数中直接使用栈内存创建MySQL对象,以及堆内存的优势和必要性。作者强调了在多线程环境下正确处理数据库连接释放的重要性,以防止内存泄漏和资源浪费。
摘要由CSDN通过智能技术生成
// PrjMySql.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <mysql.h>

int main()
{
    MYSQL* mysql = new MYSQL();//创建MySQL对象
    //MYSQL mysql;//占用的是栈上的内存
    MYSQL* pDB = mysql_init(mysql);
    if (pDB == NULL) {
        std::cout << "mysql_init failed!" << std::endl;
        return -1;
    }
    mysql_real_connect(pDB, "localhost", "root", "123456,"mysql", 3306, NULL, 0);
    mysql_close(pDB);
    delete mysql;
    return 0;
}

        直接MYSQL mysql;直接这样子创建行不行?理论上讲语法是可以的,但是不建议这样操作。为什么呢?因为这样子创建以后它是本地创建的,所以它占用的内存是栈,是本地的栈。

        所以就有一个问题,一旦这个函数结束了以后,栈上的内存是会被释放掉的,那么这个东西就有可能无效。

        在main创建,main函数结束了整个程序就结束了,就不会存在这些问题的,main函数结束了那么就不存在。肯定不可能写成main函数,为什么?它必然要建立新的线程,因为数据库操作是非常耗时的,你不可能把它放在主线程里面去,这么干的你如果一直把它放在主线程,这么干你整个程序都会被数据库给拖累。所以这个东西迟早有一天你是要放在其他线程的线程函数里面。那么在那个时候你如果还去使用这个栈,那么他的这个有效性能不能保证这就不好说了。如果一旦这个东西被释放了而你又没有正常的去close这个数据,那么会导致一个很糟糕的情况,这个链接其实是已经挂断了,但是呢服务器并不知道,因为你没有通知服务器说我这个链接不要,那么服务器会一直在那里保留一个资源等待你接入。如果你的这个程序是客户端,那么一个用户这样子搞,那么导致一个东西挂起,那两个用户这么搞导致又一个挂起。那你有成千上万个用户这样的搞,那最后的结果就是很糟糕的。哪怕说我这种释放的意外性概率很低只有1%,但是如果你有一百万个用户,一百万个用户不算多了,是一个很小的这种企业级的这种用户量已经算是很正常很小的一个中小型的一个,这种量了那像这样的一个用户搞上去,百万分之一的概率也依然会导致一万用户连接在这个数据库服务器上没有挂断,这样会把你的数据库给拖死所以你这里一定不要使用这种栈上。

    MYSQL* mysql = new MYSQL();//创建MySQL对象
    delete mysql;

        为什么在堆上去搞?因为在堆上去搞,它是长期有效的,而且这个东西它会强迫要求你去释放它,因为在堆上分配的这样一个内存,那么他如果不释放它会直接消耗掉堆于导致内存泄漏。所以呢在new之后一定要delete掉。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值