Skip to content

Destructor not invoked #13026

Closed
Closed
@cooldome

Description

Test case

type
  MyObject* = object
    len*: int
    amount: UncheckedArray[float]

  MyObjPtr* = ptr MyObject

  MyObjContainer* {.byref.} = object
    size1: int
    size2: int
    data: ptr UncheckedArray[MyObjPtr]

 
proc size1*(m: MyObjContainer): int {.inline.} = m.size1
proc size2*(m: MyObjContainer): int {.inline.} = m.size2

proc allocateMyObjPtr(size2: int): MyObjPtr =
  cast[MyObjPtr](allocShared(sizeof(MyObject) + sizeof(float) * size2.int))

proc `=destroy`*(m: var MyObjContainer) {.inline.} =
  if m.data != nil:
    for i in 0..<m.size1:
      if m.data[i] != nil:
        deallocShared(m.data[i])
        m.data[i] = nil
    deallocShared(m.data)
    echo "=destroy"
    m.data = nil

proc `=sink`*(m: var MyObjContainer, m2: MyObjContainer) {.inline.} =
  if m.data != m2.data:
    `=destroy`(m)
  m.size1 = m2.size1
  m.size2 = m2.size2  
  m.data = m2.data


proc `=`*(m: var MyObjContainer, m2: MyObjContainer) {.error.}
  ## non copyable

func newMyObjContainer*(size2: Natural): MyObjContainer =
  result.size2 = size2

proc push(m: var MyObjContainer, cf: MyObjPtr) =
  ## Add MyObjPtr to MyObjContainer, shallow copy
  m.size1.inc
  m.data = cast[ptr UncheckedArray[MyObjPtr]](reallocShared(m.data, m.size1 * sizeof(MyObjPtr)))
  m.data[m.size1 - 1] = cf

 
proc add*(m: var MyObjContainer, amount: float) =
  assert m.size2 > 0, "MyObjContainer is not initialized, use newMyObjContainer() to initialize object before use"
  let cf = allocateMyObjPtr(m.size2)
  for i in 0..<m.size2:
    cf.amount[i.int] = amount

  m.push(cf)

proc add*(dest: var MyObjContainer, src: sink MyObjContainer) =
  # merge containers

  for i in 0..<src.size1:
    dest.push src.data[i]
    src.data[i] = nil

 
proc test = 
  var cf1 = newMyObjContainer(100)
  cf1.add(1)
  cf1.add(2)

  var cf2 = newMyObjContainer(100)
  cf2.add(2)
  cf2.add(3)

  cf1.add(cf2)

test()

Expected output

=destroy
=destroy

Actual Output

=destroy

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions