zoukankan      html  css  js  c++  java
  • 一个常见的错误时编写代码

    实验室阶段做练习,其中,变化bug称号:
    #include <iostream>
    #include <vector>
    
    int main(int, char**)
    {
    	std::vector<int>** ppRandomData = distributeRandomInt(100);
    
    	for (unsigned int i=0; i<1000; i++)
    	{
    		if (ppRandomData[i])
    		{
    			std::cout << "Elements in [" << i << "] : ";
    			for (unsigned int k=0; k<ppRandomData[i]->size(); k++)
    			{
    				std::cout << ppRandomData[i]->at(k) << " ";
    			}
    			std::cout << std::endl;
    		}
    	}
    
    	delete[] ppRandomData;
    	return 0;
    }
    
    std::vector<int>** distributeRandomInt(int vMod)
    {
    	assert(vMod > 0);
    	std::vector<int> **ppContainer;
    
    	ppContainer = new std::vector<int>*[vMod];
    
    	srand(0);
    
    	for (int i=0; i<1000; i++)
    	{
    		int RandomNum = rand();
    
    		std::vector<int> *pContainer = ppContainer[RandomNum%vMod];
    	
    		if (pContainer = NULL)
    		{
    			pContainer = new std::vector<int>;
    		}
    		pContainer->push_back(RandomNum);
    	}
    	return ppContainer;
    }
    

    这个题考了几个考点:

    1 首先申请数组指针时一定要记得初始化数组中每个成员

    2指针域指针之间的赋值与引用

    3= 与==的差别

    4内存泄露 :释放指针 与释放指针的指针

    5 这个migic number

    改动例如以下:

    #include <assert.h>     //add
    #include <iostream>
    #include <vector>
    
    std::vector<int>** distributeRandomInt(int vMod);
    
    const int Total = 100;
    
    int main(int, char**)
    {
    	std::vector<int>** ppRandomData = distributeRandomInt(100);
    
    	//for (unsigned int i=0; i<1000; i++)
    	for (unsigned int i=0; i<100; i++)//100 migic number
    	{
    		if (ppRandomData[i])
    		{
    			std::cout << "Elements in [" << i << "] : ";
    			for (unsigned int k=0; k<ppRandomData[i]->size(); k++)
    			{
    				std::cout << ppRandomData[i]->at(k) << " ";
    			}
    			std::cout << std::endl;
    		}
    	}
    
    	for (int i=0; i<100; ++i)
    	{
    		if (ppRandomData[i] != NULL) delete ppRandomData[i];//释放数组中每一块申请的内存
    	}
    
    	delete[] ppRandomData;
    	return 0;
    }
    
    std::vector<int>** distributeRandomInt(int vMod)
    {
    	assert(vMod > 0);
    	std::vector<int> **ppContainer;
    
    	ppContainer = new std::vector<int>*[vMod];
    
    	for (int i=0; i<vMod; ++i)//初始化数组指针
    	{
    		ppContainer[i] = NULL;
    	}
    
    	srand(0);
    
    	for (int i=0; i<1000; i++)
    	{
    		int RandomNum = rand();
    
    		//std::vector<int> *pContainer = ppContainer[RandomNum%vMod];
    		std::vector<int>*& pContainer = ppContainer[RandomNum%vMod];//指针的引用,要改变指针的值
    		//if (pContainer = NULL)
    		if (pContainer == NULL)// = 与==的差别
    		{
    			//pContainer = new std::vector<int>;
    			pContainer = new std::vector<int>;
    		}
    		pContainer->push_back(RandomNum);
    	}
    
    	return ppContainer;
    }
    


    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    大话字符串逆序
    Class文件结构全面解析(上)
    怎么把CAT客户端的RootMessageId记录到每条日志中?
    阅读JDK源码后,我有了优化它的冲动!
    CAT客户端如何从Apollo中读取配置?
    Sublime Text 3许可证
    通俗易懂地给女朋友讲:线程池的内部原理
    五分钟后,你将学会在SpringBoot项目中如何集成CAT调用链
    分布式监控CAT服务端的本地部署
    如何优雅的设置线程池的大小?
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4868285.html
Copyright © 2011-2022 走看看