信息发布软件,b2b软件,广告发布软件

 找回密码
 立即注册
搜索
查看: 4986|回复: 13
打印 上一主题 下一主题

[『C++图文教程』] C++回收内存让程序再也不会无缘无故的消失在电脑上

[复制链接]

1868

主题

1878

帖子

1万

积分

积分
10928
跳转到指定楼层
宣传软件楼主
发表于 2017-6-27 22:21:52 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

软件教程首图:

软件教程分类:C++ 图文教程 

软件图文教程视频教程分类:软件图文教程 

软件教程难易程度:软件初级教程 

软件教程发布日期:2017-06-27

软件教程关键字:C++回收内存让程序再也不会无缘无故的消失在电脑上

① 本信息收集于网络,如有不对的地方欢迎联系我纠正!
② 本信息免费收录,不存在价格的问题!
③ 如果您的网站也想这样出现在这里,请您加好友情链接,我当天会审核通过!

④友情链接关键字:软件定制网站 网址:http://www.postbbs.com

软件教程详细描述
嵌套类分配回收内存:
  #include <stdio.h>
  #include <assert.h>
  class CA
  {
  public:
  inline static CA *GetInstance(void)
  {
  assert(m_instance != NULL);
  return m_instance;
  }
  void Print(void)
  {
  puts("主类的Print函数运行看看");
  }
  class Garbage//用来分配内存的嵌套类
  {
  public:
  Garbage(int i, int j)
  {
  printf("Garbage分配内存开始:%d %d\n", i, j);
  m_instance = new CA(123123, 234234234);
  }
  ~Garbage()
  {
  delete m_instance;
  puts("Garbage收拾残局结束");
  }
  };
  static Garbage m_garbage;
  protected:
  friend class Garbage;
  CA(int i, int j){printf("主类构造函数运行: %d %d\n", i, j);}
  ~CA(){printf("主类析构函数运行,结束了哦\n");}
  static CA *m_instance;
  };
  CA *CA::m_instance = NULL;
  CA::Garbage CA::m_garbage(2, 3);
  int main()
  {
  CA *cmb = CA::GetInstance();
  cmb->Print();
  return 0;
  }

c语言提供内存的动态分配的函数有:
malloc,calloc,realloc。在使用这些函数时,必须包含其头文件,分别为:<malloc.h>,<stdlib.h>,<alloc.h>
1.malloc函数
malloc函数原型: void *malloc(unsigned int size)
作用:在内存的动态分配区域中分配一个长度为size的连续空间。
类型说明符:void说明该函数适用与任意的数据类型。
参数:size为无符号整型数。
返回值:如果分配成功,则返回所分配内存空间的首地址。如果失败,则返回NULL。
注:申请的内存不会进行初始化。
例子:
char *p = (char *)malloc(sizeof(char)*10);
//申请了10个char长度的空间,但并不知道是否申请成功。if(NULL  == p)
{
     return;//申请内存空间失败
}
2.calloc函数
calloc函数原型:void *calloc(unsigned int num,unsigned int size)
作用:按照所给的数据个数和数据类型所占字节数,分配一个num*size连续的空间。
类型说明符:void说明该函数适用与任意的数据类型。
参数:num:无符号整数,表示要分配的个数。size:无符号整型数,表示该数据类型所占字节数。
返回值:如果分配成功,则返回内存空间的首地址,如果失败,则返回NULL。
与malloc函数区别:
     calloc申请完内存空间后,会自动初始化内存空间为0。但是malloc不会进行初始化,起内存空间存储的是一些随机数据。
例子:
char *p = (char *)calloc(10,sizeof(char));
//申请了10个char长度的内存空间
if(NULL  == p)
{
     return;//申请内存空间失败
}
3.realloc函数
realloc函数原型:void *realloc(void *ptr,unsigned int size)
作用:动态分配一个长度为size的内存空间,并把该内存空间的首地址赋值给ptr。把ptr所指的内存空间大小调整为size。
参数:ptr:指向一个内存空间的指针。size:需要的申请的内存空间大小。
返回值:如果分配成功,则返回内存空间的首地址,如果失败,则返回NULL。
注意:
  • 申请的内存空间不会进行初始化。
  • 如果有足够空间用于扩大ptr指向的内存块,则分配额外内存,并返回ptr。这里说的是“扩大”,我们知道,realloc是从堆上分配内存的,当扩大一块内存空间时, realloc()试图直接从堆上现存的数据后面的那些字节中获得附加的字节,如果能够满足,自然天下太平。也就是说,如果原先的内存大小后面还有足够的空闲空间用来分配,加上原来的空间大小= size。那么就ok。得到的是一块连续的内存。
  • 如果原先的内存大小后面没有足够的空闲空间用来分配,那么从堆中另外找一块size大小的内存。并把原来大小内存空间中的内容复制到size中,返回新的ptr指针。(数据被移动了)。老块被放回堆上。
  • 返回值。返回一个void类型指针,则分配成功。如果返回值为NULL,size=0,但是ptr!=NULL,那么原内存就丢失了。如果返回值为NULL,没有可用的内存,那么ptr所指向的内存空间不变。
  • 特殊情况。如果ptr=NULL,size=0,
例子: C++回收内存让程序再也不会无缘无故的消失在电脑上 b2b软件
C++回收内存让程序再也不会无缘无故的消失在电脑上 b2b软件
char *p = (char *)malloc(10);
//char *p = "12345";如果使用此语句,执行realloc时会发生错误char *q = p;p = (char *)realloc(p,100);//如果在p原来指向的内存后面没有足够的内存空间来扩展,那么先前分配的10个字节的内存空间被丢弃,即q指针变成了野指针
p[0] = '0';
p = (char *)realloc(p,0);
cout<<p[0]<<endl;//此语句运行时会产生错误:非法访问内存。 C++回收内存让程序再也不会无缘无故的消失在电脑上 b2b软件

C++回收内存让程序再也不会无缘无故的消失在电脑上 b2b软件


在使用c语言提供的这些动态内存分配函数后,对于这些已经申请的内存空间需要你自己进行释放。如果你没有释放,并且你只是随便运行一下自己的一个很小的程序,可能不会产生什么很大的影响。但是,如果这样一个大型程序或软件运行中调用了这些语句,而没有对申请的内存进行释放,那么后果是很严重的。
因此,在我们平时写程序的过程中,应该养成好的变成习惯。在使用了这些函数动态分配了一段内存后,要记得对其进行释放。
释放的函数为free函数:
free函数原型为:void free(void *ptr)
作用:释放由上面3种函数所申请的内存空间。
参数:ptr:指向需要释放的内存空间的首地址。
例子:
C++回收内存让程序再也不会无缘无故的消失在电脑上 b2b软件
char *p = (char *)calloc(10,sizeof(char));
//申请了10个char长度的内存空间
if(NULL  == p)
{
     return;//申请内存空间失败
}
...
free(ptr);//释放申请的内存空间 C++回收内存让程序再也不会无缘无故的消失在电脑上 b2b软件

常遇到的动态内存回收问题
在C++的编程过程中,我们经常需要申请一块动态内存,然后当用完以后将其释放。通常而言,我们的代码是这样的:
   1: void func()   2: {   3:     //allocate a dynamic memory   4:     int *ptr = new int;   5:     6:     //use ptr   7:     8:     //release allocated memory   9:     delete ptr;  10:     ptr = NULL;  11: }

如果这个函数func()逻辑比较简单,问题不大,但是当中间的代码有可能抛出异常时,上面的代码就会产生内存泄露(memory leak),如下面代码中第11行和12行将不会被执行。当然有码友会说用try-catch包起来就可以了,对,没错,但是代码中到处的try-catch也挺被人诟病的:
   1: void func()   2: {   3:     //allocate a dynamic memory   4:     int *ptr = new int;   5:     6:     throw “error”; //just an example   7:     8:     //use ptr   9:    10:     //release allocated memory  11:     delete ptr;  12:     ptr = NULL;  13: }

而且当函数有多个返回路径时,需要在每个return前都要调用delete去释放资源,代码也会变的不优雅了。
   1: void func()   2: {   3:     //allocate a dynamic memory   4:     int *ptr = new int;   5:     6:     if (...)   7:     {   8:         //...a   9:    10:         //release allocated memory  11:         delete ptr;  12:         ptr = NULL;  13:         return;  14:     } else if (....)  15:     {  16:         //...b  17:    18:         //release allocated memory  19:         delete ptr;  20:         ptr = NULL;  21:         return;  22:     }  23:    24:     //use ptr  25:    26:     //release allocated memory  27:     delete ptr;  28:     ptr = NULL;  29: }

鉴于此,我们就要想办法利用C++的一些语言特性,在函数退栈时能够将局部申请的动态内存自动释放掉。熟悉C++的码友们都知道,当一个对象退出其定义的作用域时,会自动调用它的析构函数。也就是说如果我们在函数内定义一个局部对象,在函数返回前,甚至有异常产生时,这个局部对象的析构函数都会自动调用。如果我们能够将释放资源的代码交付给这个对象的析构函数,我们就可以实现资源的自动回收。这类技术,通常被称为RAII (初始化中获取资源)。
什么是RAII以及几个例子
在C++等面向对象语言中,为了管理局部资源的分配以及释放(resource allocation and deallocation),实现异常安全(exception-safe)、避免内存泄露等问题,C++之父Bjarne Stroustrup发明了一种叫做”初始化中获取资源“ (RAII, Resource Acquisition Is Initialization,也可以叫做Scope-Bound Resource Management)的技术。简单来说,它的目的就是利用一个局部对象,在这个对象的构造函数内分配资源,然后在其析构函数内释放资源。这样,当这个局部对象退出作用域时,它所对应的的资源即可自动释放。在实现上,它通常有三个特点:
  • 创建一个特殊类,在其构造函数初申请资源;
  • 封装目标对象,将申请资源的目标对象作为这个特殊类的成员变量;
  • 在这个类的析构函数内,释放资源。
一个典型的例子就是标准库中提供的模板类std::auto_ptr。如在《C++程序设计语言》(《The C++ Programming Language, Special Edition》, Bjarne Stroustrup著,裘宗燕译)中第327页所描述的。
   1: template<class X>   2: class std::auto_ptr {   3:     4: public:   5:     //在构造函数中,获得目标指针的管理权   6:     explicit auto_ptr(X *p = 0) throw() { ptr = p; }   7:     //在析构函数中,释放目标指针   8:     ~auto_ptr() throw() { delete ptr; }   9:    10:     //...  11:    12:     //重装*和->运算符,使auto_ptr对象像目标指针ptr一样使用  13:     X& operator*() const throw() { return *ptr; }  14:     X* operator->() const throw() { return ptr; }  15:    16:     //放弃对目标指针的管理权  17:     X* release() throw() { X* t = ptr; ptr = 0; return t; }  18:    19: private:  20:     X *ptr;  21: };

想要使用它,非常简单,例如
   1: #include <memory>   2:     3: void func()   4: {   5:     std::auto_ptr<int> p(new int);   6:     7:     //use p just like ptr   8:     9:     return;  10: }

另一个例子,是利用GCC中的cleanup attribute。它可以指定一个函数,在该变量退出作用域时可以执行。例如Wikipedia上提到的宏
   1: #define RAII_VARIABLE(vartype,varname,initval,dtor) \   2:     void _dtor_ ## varname (vartype * v) { dtor(*v); } \   3:     vartype varname __attribute__((cleanup(_dtor_ ## varname))) = (initval)

我们可以这样使用,例如
   1: void example_usage() {   2:   RAII_VARIABLE(FILE*, logfile, fopen("logfile.txt", "w+"), fclose);   3:   fputs("hello logfile!", logfile);   4: }

还有一个例子,是在刘未鹏的博客文章”C++11 (及现代C++风格)和快速迭代式开发“中的”资源管理“一节中看到的,他借助C++11的std::function实现了这一特性。感兴趣的码友可以到他博客内阅读。
笔者采用的方法
对于new/delete,使用上面提到的std::auto_ptr就可以了,但是对于new/delete[]一个动态的一维数组,甚至二维数组,auto_ptr就无能为力了。而且在一些项目中,特别是一些有着悠久历史的代码中,还存在着使用malloc, new混用的现象。所以笔者设计了一个auto_free_ptr类,实现目标资源的自动回收。它的实现比较简单,只利用了RAII的第三个特点——”在类的析构函数内释放资源”,但有一个优点是可以在申请堆内存代码前使用。
代码如下,
   1: //auto_free_ptr is only used for automation free memory   2: template<class T>   3: class auto_free_ptr   4: {   5: public:   6:     typedef enum {invalid, new_one, new_array, alloc_mem} EFLAG;   7:     auto_free_ptr() { initialize();  }   8:     ~auto_free_ptr(){ free_ptr();    }   9:    10:     ///set the pointer needed to automatically free  11:     inline void set_ptr(T** new_ptr_address, EFLAG new_eflag)  12:     { free_ptr(); p_ptr = new_ptr_address; eflag = new_eflag; }  13:    14:     ///give up auto free memory  15:     inline void give_up() { initialize(); }  16:    17: protected:  18:     inline void initialize() { p_ptr = NULL; eflag = invalid; }  19:     inline void free_ptr() throw()  20:     {  21:         if(!p_ptr || !(*p_ptr)) return;  22:    23:         switch(eflag)  24:         {  25:         case alloc_mem:  { free(*p_ptr),     (*p_ptr) = NULL, p_ptr = NULL; break; }  26:         case new_one:    { delete (*p_ptr),  (*p_ptr) = NULL, p_ptr = NULL; break; }  27:         case new_array:  { delete[] (*p_ptr),(*p_ptr) = NULL, p_ptr = NULL; break; }  28:         }  29:     }  30:    31: protected:  32:     T** p_ptr;   //!< pointer to the address of the set pointer needed to automatically free  33:     EFLAG eflag; //!< the type of allocation  34:    35: private:  36:     DISABLE_COPY_AND_ASSIGN(auto_free_ptr);  37: };

为了使用方便,封装两个宏:
   1: // auto-free macros are mainly used to free the allocated memory by some local variables in the internal of function-body   2: #define AUTO_FREE_ENABLE( class, ptrName, ptrType ) \   3:     auto_free_ptr<class> auto_free_##ptrName; \   4:     auto_free_##ptrName.set_ptr(&ptrName,auto_free_ptr<class>::ptrType)   5:     6: #define AUTO_FREE_DISABLE( ptrName ) auto_free_##ptrName.give_up()

使用起来很简单,例如
   1: void func(int nLftCnt, int nRhtCnt)   2: {   3:     if (!nLftCnt && !nRhtCnt)   4:         return;   5:     6:     unsigned *pLftHashs = NULL;   7:     unsigned *pRhtHashs = NULL;   8:     9:     //在申请堆内存之前,使用auto_free_ptr  10:     AUTO_FREE_ENABLE(unsigned, pLftHashs, new_array);  11:     AUTO_FREE_ENABLE(unsigned, pRhtHashs, new_array);  12:    13:     //....  14:    15:     if (nLftCnt)  16:     {  17:         pLftHashs = new unsigned[nLftCnt];  18:         //...a  19:     }  20:    21:     if (nRhtCnt)  22:     {  23:         pRhtHashs = new unsigned[nRhtCnt];  24:         //...b  25:     }  26:    27:     //....  28:    29:     if (...)  30:     {  31:         //因为下面这个函数可以释放资源,所以在它前面放弃对目标指针的管理权  32:         AUTO_FREE_DISABLE(pLftHashs);  33:         AUTO_FREE_DISABLE(pRhtHashs);  34:    35:         //这个函数可以释放资源  36:         free_hash_arrays(pLftHashs, pRhtHashs);  37:     }  38: }

同样的,有时我们需要申请一个动态二维数组,所以也实现一个对应的auto_free_2D_ptr
   1: //auto_free_2D_ptr is only used for automation free memory of 2D array   2: template<class T>   3: class auto_free_2D_ptr   4: {   5: public:   6:     typedef enum {invalid, new_one, new_array, alloc_mem} EFLAG;   7:     auto_free_2D_ptr()  { initialize(); }   8:     ~auto_free_2D_ptr() { free_ptr();   }   9:       10:     ///set the pointer needed to automatically free  11:     inline void set_ptr( T** new_ptr_address,EFLAG new_eflag, int new_length_row )  12:     { free_ptr(); p_ptr = new_ptr_address; eflag = new_eflag; length_row = new_length_row; }  13:    14:     //give up auto free memory  15:     inline void give_up() { initialize(); }  16:    17: protected:  18:     inline void initialize() { p_ptr = NULL; eflag = invalid; length_row = 0;}  19:     inline void free_ptr() throw()  20:     {  21:         if(!p_ptr || !(*p_ptr)) return;  22:    23:         for(int i = 0; i < length_row; i++)  24:         {      25:             if(!(*p_ptr)) continue;  26:             switch(eflag)  27:             {  28:             case alloc_mem:  { free((*p_ptr));    break; }  29:             case new_one:    { delete (*p_ptr);   break; }  30:             case new_array:  { delete[] (*p_ptr); break; }  31:             }  32:             (*p_ptr) = NULL;  33:         }  34:         switch(eflag)  35:         {  36:         case alloc_mem: { free((*p_ptr));    break; }  37:         default:        { delete[] (*p_ptr); break; }  38:         }  39:         (*p_ptr) = NULL, p_ptr = NULL;   40:     }  41:    42: protected:  43:     T** p_ptr;      //!< pointer to the address of the set pointer needed to automatically free  44:     EFLAG eflag;    //!< the type of allocation  45:     int length_row; //!< the row length such as ptr[length_row][length_col]  46:    47: private:  48:     DISABLE_COPY_AND_ASSIGN(auto_free_2D_ptr);  49: };  50:    51: #define AUTO_FREE_2D_ENABLE( class, ptrName, ptrType, rowNum ) \  52:     auto_free_2D_ptr<class> auto_free_##ptrName; \  53:     auto_free_##ptrName.set_ptr(&ptrName,auto_free_2D_ptr<class>::ptrType, rowNum)  54:    55: #define AUTO_FREE_2D_DISABLE( ptrName )  AUTO_FREE_DISABLE( ptrName )

下面是个例子
   1: void func(int row, int col)   2: {   3:     if (!row && !col)   4:         return;   5:     6:     int **ptr = new int*[ row ];   7:     for( int r = 0; r < row; ++r ) { ptr[r] = new int[ col ];}   8:     9:     AUTO_FREE_2D_ENABLE( int, ptr, new_array, row );  10:    11:     //....  12: }

到这里就结束了,有些码友可能会说,何必这么麻烦,boost内有很多智能指针供选择,用share_ptr, scoped_ptr, scoped_array,unique_ptr, auto_ptr 中的一个不就行了吗? 没错!如果你正在开发的代码中,允许用boost,并且在相关程序接口统一都用智能指针来管理、不会用到源对象指针的话,当然优先选boost,但是当你的代码中由于历史原因,有些接口不可变更,且new/delete, malloc/free都存在,而且依然需要使用源对象指针来完成大部分工作时,不妨试试我设计的这个阉割版的scoped_ptr/scoped_array。总之,根据自己的实际情况来选择合适的方案,如果标准方案不适用,就自己写一个。
如果码友有更好的实现方式或者发现什么问题,还请批评指正。

unto无需多言C++几行代码让屏幕保护失去应该的效果next志趣B2B网站自动信息发布软件
回复

使用道具 举报

0

主题

1025

帖子

1027

积分

积分
1027
信息发布软件沙发
发表于 2017-7-2 03:08:16 | 只看该作者
,第一次买很满意,服务态度很好

回复 支持 反对

使用道具 举报

0

主题

591

帖子

591

积分

积分
591
推广工具板凳
发表于 2017-7-5 02:15:02 | 只看该作者
高大上了,服务很周到,能达到我想要的效果,设计后生意越来越好了!好开心啊!

回复 支持 反对

使用道具 举报

0

主题

1023

帖子

1034

积分

积分
1034
软件定制开发地板
发表于 2017-7-6 15:32:06 | 只看该作者
家很给力,自己不是很懂卖家马上给处理咯。给力给力

回复 支持 反对

使用道具 举报

0

主题

636

帖子

624

积分

积分
624
5#定制软件#
发表于 2017-7-6 22:09:13 | 只看该作者
,老板人真心不错,给我便宜了许多

回复 支持 反对

使用道具 举报

0

主题

615

帖子

589

积分

积分
589
6#定制软件#
发表于 2017-7-13 06:55:42 | 只看该作者
,大爱,喜欢,是我想要的,不错,值得购买,

回复 支持 反对

使用道具 举报

0

主题

602

帖子

594

积分

积分
594
7#定制软件#
发表于 2017-7-13 08:35:43 | 只看该作者
我抢、我抢、我抢沙发~

回复 支持 反对

使用道具 举报

0

主题

632

帖子

622

积分

积分
622
8#定制软件#
发表于 2017-7-18 19:00:01 | 只看该作者
7一直很耐心解决问题。

回复 支持 反对

使用道具 举报

0

主题

596

帖子

677

积分

积分
677
9#定制软件#
发表于 2017-7-19 08:08:36 | 只看该作者
强大,使用简单便捷,真心的不错,卖家发货速度快,赞。

回复 支持 反对

使用道具 举报

0

主题

661

帖子

669

积分

积分
669
10#定制软件#
发表于 2017-7-22 20:12:14 | 只看该作者
心的帮助设置模板,非常满意!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关导读
信息发布软件AIWROK软件苹果UI按钮Button方法示例
AIWROK软件苹果UI按钮Button方法示例
信息发布软件AIWROK软件苹果TAB界面视图示例
AIWROK软件苹果TAB界面视图示例
信息发布软件AIWROK苹果系统自带view视图简洁UI界面示例
AIWROK苹果系统自带view视图简洁UI界面示例
信息发布软件汇集HID安卓输入文字的方法和复制粘贴示例
汇集HID安卓输入文字的方法和复制粘贴示例
信息发布软件AIWROK软件找字与OCR方法汇总示例
AIWROK软件找字与OCR方法汇总示例
信息发布软件AIWROK软件找图方法汇总示例
AIWROK软件找图方法汇总示例
信息发布软件AIWROK软件滑动方法集合示例
AIWROK软件滑动方法集合示例
信息发布软件AIWROK软件安卓AIWROK汇集软件点击
AIWROK软件安卓AIWROK汇集软件点击
信息发布软件苹果系统点击方法综合示例
苹果系统点击方法综合示例
信息发布软件AIWROK苹果系统找图方法完整示例集合
AIWROK苹果系统找图方法完整示例集合
信息发布软件苹果系统找图方法完整示例集合
苹果系统找图方法完整示例集合
信息发布软件苹果IOS系统找字OCR方法例子
苹果IOS系统找字OCR方法例子
信息发布软件AIWORK软件数组高级示例
AIWORK软件数组高级示例
信息发布软件AIWROK软件运算符封装库示例
AIWROK软件运算符封装库示例
信息发布软件AIWROK软件语法运行小示例
AIWROK软件语法运行小示例
信息发布软件AIWROK软件JS循环小示例
AIWROK软件JS循环小示例
信息发布软件AIWROK软件H5网页被主脚本获取值用法
AIWROK软件H5网页被主脚本获取值用法
信息发布软件AIWROK软件创建可暂停恢复的多线程任务
AIWROK软件创建可暂停恢复的多线程任务
信息发布软件AIWROK软件类型转换方法例子
AIWROK软件类型转换方法例子
信息发布软件AIWROK软件H5脚本执行与进度显示
AIWROK软件H5脚本执行与进度显示 .
信息发布软件AIWROK软件根据时间段执行异步任务支持多线程并行处理
AIWROK软件根据时间段执行异步任务支持多线程并行处理
信息发布软件H5自动开关执行脚本功能演示
H5自动开关执行脚本功能演示
信息发布软件AIWROK软件H5单选脚本运行示例
AIWROK软件H5单选脚本运行示例
信息发布软件H5任务脚本选择与执行中心
H5任务脚本选择与执行中心
信息发布软件H5里CheckBox控件演示
H5里CheckBox控件演示
信息发布软件AIWROK软件正则用法实际例子
AIWROK软件正则用法实际例子
信息发布软件AIWROK软件权限管理器实现
AIWROK软件权限管理器实现
信息发布软件AIWORK软件节点方法无碍示例子
AIWORK软件节点方法无碍示例子
信息发布软件JSON.stringify 和 JSON.parse 完整示例
JSON.stringify 和 JSON.parse 完整示例
信息发布软件AIWROK软件展示JavaScript各种语句标识符的用法
AIWROK软件展示JavaScript各种语句标识符的用法
信息发布软件JS巧妙地组合使用各种条件语句
JS巧妙地组合使用各种条件语句
信息发布软件AIWROK手机数据库MySQL数据库截图片批量上传操作脚本
AIWROK手机数据库MySQL数据库截图片批量上传操作脚本
信息发布软件HID中文输入智能打字功能
HID中文输入智能打字功能
信息发布软件AIWROK软件对象工具函数库例子
AIWROK软件对象工具函数库例子
信息发布软件AIWROK软件H5交互演示黄色主题
AIWROK软件H5交互演示黄色主题
信息发布软件H5单按钮执行脚本示例
H5单按钮执行脚本示例
信息发布软件苹果H5界面完整调用脚本示例
苹果H5界面完整调用脚本示例
信息发布软件AIWROK软件平台设备信息全面检测工具例子
AIWROK软件平台设备信息全面检测工具例子
信息发布软件AIWROK创建和放大日志窗口并展示动态内容
AIWROK创建和放大日志窗口并展示动态内容
信息发布软件AIWROK软件device相关方法获取设备信息例子
AIWROK软件device相关方法获取设备信息例子[/backcolor]
信息发布软件数据库MySQL实时内容随机调用
数据库MySQL实时内容随机调用
信息发布软件AIWROK软件分享一个特效苹果H5页面
AIWROK软件分享一个特效苹果H5页面
信息发布软件数据库MYQ业务流程心跳程序启动
数据库MYQ业务流程心跳程序启动
信息发布软件数据库MySQL功能支持创建表插入中文数据查询删除功能例子
数据库MySQL功能支持创建表插入中文数据查询删除功能例子
信息发布软件AIWROK软件Zip 高级操作复杂示例
AIWROK软件Zip 高级操作复杂示例
信息发布软件AIWROK软件txt_文件读写方法小结
AIWROK软件txt_文件读写方法小结
信息发布软件AIWROK软件file文件操作方法小结
AIWROK软件file文件操作方法小结
信息发布软件AIWORK软件配置读写H5演示配套脚本
AIWORK软件配置读写H5演示配套脚本
信息发布软件AIWROK配置读写功能演示示例
AIWROK配置读写功能演示示例
信息发布软件AIWROK截图缓存工具
AIWROK截图缓存工具
信息发布软件AIWROK线程许可证工具
AIWROK线程许可证工具
信息发布软件整理了AIWROK环境下常用的Date对象和sleep对象方法
整理了AIWROK环境下常用的Date对象和sleep对象方法
信息发布软件FastUI界面普通用法
FastUI界面普通用法
信息发布软件FastUI界面类[window]方法小结
FastUI界面类[window]方法小结 方法 1:close(关闭指定窗口)方法 2:closeAll(关闭所有窗口)方法 3:loadUI(加载 UI 界面)方法 4:onClose(监听窗口关闭事件)方法 5:onLoad(监听窗口加载事件)方法 6:setFull(设置窗口全屏)方法 7:setHeight(设置窗口高度)方法 8:setHidden(隐藏窗口)方法 9:setLeft(设置窗口 X 轴坐标)方法 10:setTop(设置窗口 Y 轴坐标)方法 11:setVisable(显示隐藏的窗口)方
信息发布软件AIWROK软件按钮监听UI界面与事件监听功能演示
AIWROK软件按钮监听UI界面与事件监听功能演示.
信息发布软件AWIROK软件多选[uiCheckBox]方法小结
AWIROK软件多选方法小结 方法一:findByID 加载多选控件方法二:getAllChecked 获取所有选中项方法三:getAllSelect 获取所有选项方法四:getChecked 获取某个选项是否选中方法五:setChecked 设置某个选项是否选中方法六:setCheckeds 设置多个选项是否选中方法七:setHeight 设置高度
信息发布软件AIWROK日志演示开启日志显示 → 放大 → 关闭代码
AIWROK日志演示开启日志显示 → 放大 → 关闭代码
信息发布软件&#127983;AIWROK数组方法高级应用案例
🏯AIWROK数组方法高级应用案例
信息发布软件AIWROK软件日志悬浮窗简化版自动切换位置
AIWROK软件日志悬浮窗简化版自动切换位置
信息发布软件AIWROK软件String实例演示
AIWROK软件String实例演示
信息发布软件AIWROK软件S内置String类[String]方法小结
AIWROK软件S内置String类[String]方法小结 方法 1:charAt[/backcolor]方法 2:charCodeAt[/backcolor]方法 3:indexOf[/backcolor]方法 4:lastIndexOf[/backcolor]方法 5:length[/backcolor]方法 6:match[/backcolor]方法 7:replace[/backcolor]方法 8:replaceAll[/backcolor]方法 9:split[/backcolor]方法 10:startsWith[/backcolor]方法 11:substr[/backcolor]方法 12:substring[/backcolor]方法 13:trim[/backcol
信息发布软件AIWROK软件完整的WebSocket客户端示例
这段代码是一个完整的WebSocket客户端示例,用于连接到指定的WebSocket服务器并处理各种事件。具体来说,代码的作用如下: 定义服务器地址:首先定义了一个服务器的IP地址和端口号 var ip = "154.37.221.104:8886";。 创建WebSocket对象:尝试创建一个新的WebSocket对象 var ws = new WebSocket();。注意,这里的 new ws() 应该是 new WebSocket()。 添加事件监听器:代码中尝试为WebSocket对象添加事件监听器,但这里有一个错误。
信息发布软件AIWROK软件苹果系统中实现四种基本滑动操作
AIWROK软件苹果系统中实现四种基本滑动操作
信息发布软件hid的滑动没有百分比坐标滑动吗
hid的滑动没有百分比坐标滑动吗
信息发布软件单选控件[uiRadioButton]方法小结
单选控件方法小结 方法 1:加载单选控件[/backcolor]方法 2:获取选中项[/backcolor]方法 3:设置高度[/backcolor]方法 4:设置选中项[/backcolor]

QQ|( 京ICP备09078825号 )

本网站信息发布软件,是可以发布论坛,发送信息到各大博客,各大b2b软件自动发布,好不夸张的说:只要手工能发在电脑打开IE能发的网站,用这个宣传软件就可以仿制动作,进行推送发到您想发送的B2B网站或是信息发布平台上,不管是后台,还是前台,都可以进行最方便的广告发布,这个广告发布软件,可以按月购买,还可以试用软件,对网站的验证码也可以完全自动对信息发布,让客户自动找上门,使企业轻松实现b2b发布,这个信息发布软件,均是本站原创正版开发,拥有正版的血统,想要新功能,欢迎提意见给我,一好的分类信息群发软件在手,舍我其谁。QQ896757558

GMT+8, 2026-2-18 22:48 , Processed in 0.296288 second(s), 60 queries .

宣传软件--信息发布软件--b2b软件广告发布软件

快速回复 返回顶部 返回列表