关于DLL内部使用内存在外部析构出错的问题

fang_jb 2003-04-15 11:25:10
我写了一个DLL,其中有函数用了一个vector<T>&作为参数传递,需要返回一个列表的信息,但在编写过程中遇到这样一个问题,在外部vector的大小未知,无法进行内存的分配,申请一个空的vector传入,然后在DLL中使用push_back进行动态的内存分配,这样做有一个问题,在外部函数退出vector进行析构的时候会抛出异常,因为vector分配的内存是在DLL内部的,两者处在不同的内存空间上,外部析构会有问题

这样就不太好办,不知道有什么招可以解决或者绕过这个问题?请指教
...全文
101 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiadrun 2003-04-15
  • 打赏
  • 举报
回复
关注!
ndy_w 2003-04-15
  • 打赏
  • 举报
回复
1 两次调用,第一次返回需要的空间,第二次填充空间。
2 不断调用,每次返回一部分
webber84 2003-04-15
  • 打赏
  • 举报
回复
具体的原因我也不太清楚,上次我做的一个程序也出过这种错,后来用boundschecker调试的时候它说是这个原因造成的。 可能跟静态库中使用的全局变量有关。
fang_jb 2003-04-15
  • 打赏
  • 举报
回复
to webber84(***闭关修炼中***) :

解决了,多谢多谢,不过,可以告诉一下原因吗?
In355Hz 2003-04-15
  • 打赏
  • 举报
回复
利用 vector 模版的第二个参数如何?

vector< class T, class A = allocator<T> >

在 DLL 中为 T 实现一个 dll_allocator , 所有代码照搬 std::allocator<T> 然后导出这个 dll_allocator ,然后 DLL 指定传递的参数为 vector<T, dll_allocator>& ,EXE 中构造一个 vector<T, dll_allocator > 作为参数。

// dll *.h
typedef class __declspec(dllexport) dll_allocator
{
public:
typedef size_t size_type;

typedef ptrdiff_t difference_type;

typedef TYPE *pointer;
typedef const TYPE *const_pointer;
typedef TYPE& reference;
typedef const TYPE& const_reference;
typedef TYPE value_type;

TYPE * address(TYPE& x) const
{ return &(x); }

const TYPE * address(const TYPE& x) const
{ return &(x); }

TYPE * allocate(size_t n, const void *);

void deallocate(TYPE _FARQ * p, size_t);

void construct(TYPE * p, const TYPE& val);

void destroy(TYPE * p);

size_t max_size() const
{
size_t n = (size_t)(-1) / sizeof(TYPE);
return (0 < n ? n : 1);
}
};

// dll *.cpp
TYPE * _dll_allocator::allocate(size_t n, const void *)
{
return (_Allocate((_PDFT)n, (TYPE *)0));
}

void _dll_allocator::deallocate(TYPE _FARQ * p, size_t)
{
operator delete(p);
}

void _dll_allocator::construct(TYPE * p, const TYPE& val)
{
_Construct(p, val);
}

void _dll_allocator::destroy(TYPE * p)
{
_Destroy(p);
}
o_racle 2003-04-15
  • 打赏
  • 举报
回复
关注!
webber84 2003-04-15
  • 打赏
  • 举报
回复
用动态库版本的c run-time library可以解决这个问题。
在project->setting->c/c++ ->category中选code generation,然后在use run-time library中选debug multithreaded dll。
fang_jb 2003-04-15
  • 打赏
  • 举报
回复
但其实效率是很大的问题,因为我这的具体应用是返回一张数据库表的记录集,当数据表数据达到十万级的时候,每次都需要先计算一次大小的话,开销有点过了

to nlstone(天外流星):
我试试,但感觉上会比较复杂
ndy_w 2003-04-15
  • 打赏
  • 举报
回复
效率低是无可奈何了,除非在同一个地址空间。
不过好像也就多了点压栈推栈,越界判断,损失不算大。
nlstone 2003-04-15
  • 打赏
  • 举报
回复
vector声明在DLL中,导出一个创建vector的函数,譬如CreateVector(……);
catyou 2003-04-15
  • 打赏
  • 举报
回复
我认为一楼的想法可以。windows也有很多这样的函数, 先调用判断需要的空间, 再取数据。
fang_jb 2003-04-15
  • 打赏
  • 举报
回复
一楼这个想法倒是比较正统,不过我觉得不合适啊,这样做的效率实在不高

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧