• 一个常见的错误时编写代码


    实验室阶段做练习,其中,变化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;
    }
    


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

  • 相关阅读:
    函数式编程之Functional.js源码解析(一)
    libevent的bufferevent
    Luna
    线程池的实现
    如何排查字节对齐问题引起的程序诡异崩溃
    GCC编译之如何控制共享文件导出符号
    ubuntu禁用独显的问题
    protobuf的一些细节
    GCC编译之新老版本共存
    libevent的evbuffer之减少内存拷贝
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4868285.html
Copyright © 2020-2023  润新知