ACE内存分配宏:
ACE_NEW ( P, C) ///使用构造器c分配内存,并把指针赋给p。在失败时,p被设置为0并执行return;
ACE_NEW_RETURN ( P, C, R) ///使用构造器c分配内存,并把指针赋给p。在失败时,p被设置为0并执行return r;
ACE_NEW_NORETURN ( P, C) ///使用构造器c分配内存,并把指针赋给p。在失败时,p被设置为0并执行下一条语句;
ACE日志宏:
ACE_ASSERT( TEST ); //测试失败,打印一条断言消息,然后应用终止。
ACE_RETURN( VALUE ); //不打印消息,发出调用的函数会返回,返回值为value;op_status被设为value;
ACE_DEBUG ( ( Severity, formatting-args ) );
ACE_ERROR ( ( Severity, formatting-args ) );
ACE_TRACE ( STRING );
ACE_DLList: 双向链表在序列中同时维护有向前和后向的链接,从而可以高效的进行向前或向后的遍历,但不能对元素进行随机访问。它是一个引用容器,而非值容器,它只存储指向你插入其中的值得指针。以下DataElement会记住自己现在有多少个实例。
main.cpp
#include "ListTest.h"
int DataElement::count_=0;
#pragma comment(lib, "E:\\ACE_wrappers\\lib\\ACEd.lib")
int ACE_TMAIN(int, ACE_TCHAR *[])//int main()
{
ListTest mylist;
return mylist.run();
}
DataElement
class DataElement
{
friend class DataElementEx;
public:
DataElement() { count_++; }
DataElement(int data):data_(data) { count_++; }
DataElement(const DataElement & e)
{
data_=e.getData();
count_++;
}
DataElement & operator= (const DataElement & e)
{
data_=e.getData();
return *this;
}
bool operator== (const DataElement & e)
{ return this->data_==e.data_; }
~DataElement() { count_--; }
int getData(void) const { return data_; }
void setData(int val) { data_=val; }
static int numOfActiveObjects(void) { return count_; }
private:
int data_;
static int count_;
};
listTest类:
// ListTest.h: interface for the ListTest class.
//
//
#if !defined(AFX_LISTTEST_H__BA088283_594B_4459_9950_6E3DC1FA5D48__INCLUDED_)
#define AFX_LISTTEST_H__BA088283_594B_4459_9950_6E3DC1FA5D48__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "DataElement.h"
#include "ace/Containers.h"
typedef ACE_DLList<DataElement> MyList;
class ListTest
{
public:
ListTest();
virtual ~ListTest();
int run(void);
void displayList(MyList & list);
void destroyList(MyList & list);
};
#endif // !defined(AFX_LISTTEST_H__BA088283_594B_4459_9950_6E3DC1FA5D48__INCLUDED_)
实现文件:
// ListTest.cpp: implementation of the ListTest class.
//
//
#include "ListTest.h"
//
// Construction/Destruction
//
ListTest::ListTest()
{
}
ListTest::~ListTest()
{
}
int ListTest::run()
{
ACE_TRACE(ACE_TEXT("ListTest::run"));
MyList list1;
for(int i=0; i<100; i++)
{
DataElement *element;
ACE_NEW_RETURN (element, DataElement(i), -1);
list1.insert_tail(element);
}
this->displayList(list1);
MyList list2;
list2=list1;
this->displayList(list2);
this->destroyList(list2);
ACE_DEBUG((LM_DEBUG,ACE_TEXT("# of live objects: %d\n"),DataElement::numOfActiveObjects()));
return 0;
}
void ListTest::displayList(MyList & list)
{
ACE_TRACE(ACE_TEXT("ListTest::displayTest"));
ACE_DEBUG((LM_DEBUG,ACE_TEXT("Forward iteration\n")));
ACE_DLList_Iterator<DataElement> iter(list);
while(!iter.done())
{
ACE_DEBUG((LM_DEBUG,ACE_TEXT("%d:"),iter.next()->getData()));
iter++;
}
ACE_DEBUG((LM_DEBUG,ACE_TEXT("\n")));
ACE_DEBUG((LM_DEBUG,ACE_TEXT("Reverse Iteration\n")));
ACE_DLList_Reverse_Iterator<DataElement> riter(list);
while(!riter.done())
{
ACE_DEBUG((LM_DEBUG,ACE_TEXT("%d:"),riter.next()->getData()));
riter++;
}
ACE_DEBUG((LM_DEBUG,ACE_TEXT("\n")));
}
void ListTest::destroyList(MyList & list)
{
ACE_TRACE(ACE_TEXT("ListTest::destroyTest"));
ACE_DEBUG((LM_DEBUG,ACE_TEXT("Destroy data element\n")));
for(ACE_DLList_Iterator<DataElement> iter(list);
!iter.done();
iter++)
{
DataElement *de=iter.next();
delete de;
}
}
打印结果:
Forward iteration
0:1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:17:18:19:20:21:22:23:24:25:26:27:28:29:
30:31:32:33:34:35:36:37:38:39:40:41:42:43:44:45:46:47:48:49:50:51:52:53:54:55:56
:57:58:59:60:61:62:63:64:65:66:67:68:69:70:71:72:73:74:75:76:77:78:79:80:81:82:8
3:84:85:86:87:88:89:90:91:92:93:94:95:96:97:98:99:
Reverse Iteration
99:98:97:96:95:94:93:92:91:90:89:88:87:86:85:84:83:82:81:80:79:78:77:76:75:74:73
:72:71:70:69:68:67:66:65:64:63:62:61:60:59:58:57:56:55:54:53:52:51:50:49:48:47:4
6:45:44:43:42:41:40:39:38:37:36:35:34:33:32:31:30:29:28:27:26:25:24:23:22:21:20:
19:18:17:16:15:14:13:12:11:10:9:8:7:6:5:4:3:2:1:0:
Forward iteration
0:1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:17:18:19:20:21:22:23:24:25:26:27:28:29:
30:31:32:33:34:35:36:37:38:39:40:41:42:43:44:45:46:47:48:49:50:51:52:53:54:55:56
:57:58:59:60:61:62:63:64:65:66:67:68:69:70:71:72:73:74:75:76:77:78:79:80:81:82:8
3:84:85:86:87:88:89:90:91:92:93:94:95:96:97:98:99:
Reverse Iteration
99:98:97:96:95:94:93:92:91:90:89:88:87:86:85:84:83:82:81:80:79:78:77:76:75:74:73
:72:71:70:69:68:67:66:65:64:63:62:61:60:59:58:57:56:55:54:53:52:51:50:49:48:47:4
6:45:44:43:42:41:40:39:38:37:36:35:34:33:32:31:30:29:28:27:26:25:24:23:22:21:20:
19:18:17:16:15:14:13:12:11:10:9:8:7:6:5:4:3:2:1:0:
Destroy data element
# of live objects: 0